tx · 25o3gzaMe49eZgUyoMEdqps81Pfptxej6NQZU6mHLDJc

3N9kbR6BQEQV7pwBfDFzprJtNofgi6fSJ6Y:  -0.03700000 Waves

2022.12.08 11:40 [2351138] smart account 3N9kbR6BQEQV7pwBfDFzprJtNofgi6fSJ6Y > SELF 0.00000000 Waves

{ "type": 13, "id": "25o3gzaMe49eZgUyoMEdqps81Pfptxej6NQZU6mHLDJc", "fee": 3700000, "feeAssetId": null, "timestamp": 1670488871676, "version": 2, "chainId": 84, "sender": "3N9kbR6BQEQV7pwBfDFzprJtNofgi6fSJ6Y", "senderPublicKey": "EajGg1J8duApPELWPw9gVkPwAKFC9hujhvCcne4FunUa", "proofs": [ "5qDEebTNKi6KErvXGectAoNdkuCr6tv3d2Q5ckyqvpNEgXASUgVQw8wDM28mX8CzwxLk4GHsNxfdUqbChc5J89Y1" ], "script": "base64:BgI4CAISAwoBCBIAEgMKAQgSCgoICAEBAQEBAQgSDQoLCAgBAQEBAQEICAESAwoBARIDCgEBEgMKAQE3ABRrX2Nvb3JkaW5hdG9yQWRkcmVzcwIUa19jb29yZGluYXRvckFkZHJlc3MAEmtfYWRtaW5fcHVibGljX2tleQISa19hZG1pbl9wdWJsaWNfa2V5AA1rX3F1b3RlX2Fzc2V0Ag1rX3F1b3RlX2Fzc2V0AAVrX2FtbQIFa19hbW0AEWtfbWFuYWdlcl9hZGRyZXNzAhFrX21hbmFnZXJfYWRkcmVzcwASa19wb3NpdGlvblNlcXVlbmNlAhJrX3Bvc2l0aW9uU2VxdWVuY2UADmtfcG9zaXRpb25TaXplAg5rX3Bvc2l0aW9uU2l6ZQAFa19mZWUCBWtfZmVlABBrX2V4ZWN1dGVkT3JkZXJzAhBrX2V4ZWN1dGVkT3JkZXJzABBrX2NhbmNlbGVkT3JkZXJzAhBrX2NhbmNlbGVkT3JkZXJzAAdrX29yZGVyAgdrX29yZGVyAA1rX2xhc3RPcmRlcklkAg1rX2xhc3RPcmRlcklkABBrX3RyYWRlck9yZGVyQ250AhBrX3RyYWRlck9yZGVyQ250AAhrX3NlbmRlcgIIa19zZW5kZXIADWtfaW5pdGlhbGl6ZWQCDWtfaW5pdGlhbGl6ZWQABFNUT1AAAQAEVEFLRQACAAVMSU1JVAADAARMT05HAAEABVNIT1JUAAIACElOQ1JFQVNFAAEACERFQ1JFQVNFAAIAGU1BWF9UUkFERVJfT1JERVJTX1BFUl9BTU0ABQAEVElNRQgFCWxhc3RCbG9jawl0aW1lc3RhbXAADERFQ0lNQUxfVU5JVAkAaAIAAQkAaAIJAGgCCQBoAgkAaAIJAGgCAAoACgAKAAoACgAKAAxTUFJFQURfTElNSVQJAGkCBQxERUNJTUFMX1VOSVQAyAEBA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEEbWludgICX3gCX3kDCQBmAgUCX3gFAl95BQJfeQUCX3gBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBEGV4ZWN1dGVkT3JkZXJLZXkBCF9vcmRlcklkCQCsAgIJAKwCAgUQa19leGVjdXRlZE9yZGVycwIBXwkApAMBBQhfb3JkZXJJZAEQY2FuY2VsZWRPcmRlcktleQEIX29yZGVySWQJAKwCAgkArAICBRBrX2NhbmNlbGVkT3JkZXJzAgFfCQCkAwEFCF9vcmRlcklkAQhvcmRlcktleQEIX29yZGVySWQJAQ50b0NvbXBvc2l0ZUtleQIFB2tfb3JkZXIJAKQDAQUIX29yZGVySWQBE3RyYWRlck9yZGVyQ291bnRLZXkCBF9hbW0HX3RyYWRlcgkArAICCQCsAgIJAKwCAgkArAICBRBrX3RyYWRlck9yZGVyQ250AgFfBQRfYW1tAgFfBQdfdHJhZGVyAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwITQ29vcmRpbmF0b3Igbm90IHNldAEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAEObWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19tYW5hZ2VyX2FkZHJlc3MCD01hbmFnZXIgbm90IHNldAELaXNXaGl0ZWxpc3QBCF9hZGRyZXNzCQELdmFsdWVPckVsc2UCCQCbCAIJAQtjb29yZGluYXRvcgAJAQ50b0NvbXBvc2l0ZUtleQIFBWtfYW1tBQhfYWRkcmVzcwcBDmFkbWluUHVibGljS2V5AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRJrX2FkbWluX3B1YmxpY19rZXkBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEHaXNWYWxpZAEIX29yZGVySWQDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARBleGVjdXRlZE9yZGVyS2V5AQUIX29yZGVySWQHCQACAQkArAICAhhPcmRlciBhbHJlYWR5IGV4ZWN1dGVkOiAJAKQDAQUIX29yZGVySWQDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARBjYW5jZWxlZE9yZGVyS2V5AQUIX29yZGVySWQHCQACAQkArAICAhlPcmRlciBhbHJlYWR5IGNhbmNlbGxlZDogCQCkAwEFCF9vcmRlcklkBgEOY3VycmVudE9yZGVySWQACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtfbGFzdE9yZGVySWQAAAETZ2V0VHJhZGVyT3JkZXJDb3VudAIEX2FtbQdfdHJhZGVyBANrZXkJARN0cmFkZXJPcmRlckNvdW50S2V5AgUEX2FtbQUHX3RyYWRlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEIZ2V0T3JkZXIBCF9vcmRlcklkBAhvcmRlclN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQhvcmRlcktleQEFCF9vcmRlcklkCQCsAgICEkludmFsaWQgb3JkZXIgaWQ6IAkApAMBBQhfb3JkZXJJZAQNb3JkZXJQYXJ0TGlzdAkAtQkCBQhvcmRlclN0cgIBLAQDYW1tCQCRAwIFDW9yZGVyUGFydExpc3QAAAQGdHJhZGVyCQCRAwIFDW9yZGVyUGFydExpc3QAAQQIYW1vdW50SW4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QAAgIQSW52YWxpZCBhbW91bnRJbgQIbGV2ZXJhZ2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QAAwIQSW52YWxpZCBsZXZlcmFnZQQEdHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAEAgxJbnZhbGlkIHR5cGUEDHRyaWdnZXJQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAFAhRJbnZhbGlkIHRyaWdnZXJQcmljZQQLcGF5bWVudFVzZG4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QABgITSW52YWxpZCBwYXltZW50VXNkbgQEc2lkZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAHAgxJbnZhbGlkIHNpZGUEB3JlZkxpbmsJAJEDAgUNb3JkZXJQYXJ0TGlzdAAIBApwb3NpdGlvbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAkCEkludmFsaWQgcG9zaXRpb25JZAQKbGltaXRQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAKAhJJbnZhbGlkIGxpbWl0UHJpY2UJAJ0KCwUDYW1tBQZ0cmFkZXIFCGFtb3VudEluBQhsZXZlcmFnZQUEdHlwZQUMdHJpZ2dlclByaWNlBQtwYXltZW50VXNkbgUEc2lkZQUHcmVmTGluawUKcG9zaXRpb25JZAUKbGltaXRQcmljZQEOZ2V0TWFya2V0UHJpY2UBBF9hbW0EAXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQIQY29tcHV0ZVNwb3RQcmljZQUDbmlsBQNuaWwDCQAAAgUBcwUBcwQDcmVzBAckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECH0ludmFsaWQgY29tcHV0ZVNwb3RQcmljZSByZXN1bHQJAQV2YWx1ZQEFA3JlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEGZ2V0RmVlAgRfYW1tB190cmFkZXIEAXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQIfY29tcHV0ZUZlZUZvclRyYWRlcldpdGhBcnRpZmFjdAkAzAgCBQdfdHJhZGVyCQDMCAICAAUDbmlsBQNuaWwDCQAAAgUBcwUBcwQDcmVzBAckbWF0Y2gwBQFzAwkAAQIFByRtYXRjaDACDihJbnQsIEJvb2xlYW4pBAF0BQckbWF0Y2gwCAUBdAJfMQkAAgECLkludmFsaWQgY29tcHV0ZUZlZUZvclRyYWRlcldpdGhBcnRpZmFjdCByZXN1bHQJAQV2YWx1ZQEFA3JlcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEPZ2V0UG9zaXRpb25TaXplAgRfYW1tB190cmFkZXIEA2FtbQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQQHc2l6ZUtleQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFB190cmFkZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUDYW1tBQdzaXplS2V5AAABDWdldFBvc2l0aW9uSWQCBF9hbW0HX3RyYWRlcgQDYW1tCQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tBAZzZXFLZXkJAQ50b0NvbXBvc2l0ZUtleQIFEmtfcG9zaXRpb25TZXF1ZW5jZQUHX3RyYWRlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQNhbW0FBnNlcUtleQAAAQlnZXRTcHJlYWQBBl9wcmljZQkBBG11bGQCBQZfcHJpY2UFDFNQUkVBRF9MSU1JVAEJc2F2ZU9yZGVyDAhfb3JkZXJJZARfYW1tB190cmFkZXIJX2Ftb3VudEluCV9sZXZlcmFnZQVfdHlwZQ1fdHJpZ2dlclByaWNlDF9wYXltZW50VXNkbgVfc2lkZQhfcmVmTGluawtfcG9zaXRpb25JZAtfbGltaXRQcmljZQQIb3JkZXJTdHIJALkJAgkAzAgCBQRfYW1tCQDMCAIFB190cmFkZXIJAMwIAgkApAMBBQlfYW1vdW50SW4JAMwIAgkApAMBBQlfbGV2ZXJhZ2UJAMwIAgkApAMBBQVfdHlwZQkAzAgCCQCkAwEFDV90cmlnZ2VyUHJpY2UJAMwIAgkApAMBBQxfcGF5bWVudFVzZG4JAMwIAgkApAMBBQVfc2lkZQkAzAgCBQhfcmVmTGluawkAzAgCCQCkAwEFC19wb3NpdGlvbklkCQDMCAIJAKQDAQULX2xpbWl0UHJpY2UFA25pbAIBLAkAzAgCCQELU3RyaW5nRW50cnkCCQEIb3JkZXJLZXkBBQhfb3JkZXJJZAUIb3JkZXJTdHIFA25pbAEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMEX2FtbQdfdHJhZGVyBl9jb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE3RyYWRlck9yZGVyQ291bnRLZXkCBQRfYW1tBQdfdHJhZGVyBQZfY291bnQFA25pbAERdXBkYXRlTGFzdE9yZGVySWQBDF9sYXN0T3JkZXJJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUNa19sYXN0T3JkZXJJZAUMX2xhc3RPcmRlcklkBQNuaWwBEG1hcmtFeGVjdXRlT3JkZXIBCF9vcmRlcklkCQDMCAIJAQxCb29sZWFuRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRBrX2V4ZWN1dGVkT3JkZXJzCQCkAwEFCF9vcmRlcklkBgUDbmlsAQ9tYXJrQ2FuY2VsT3JkZXIBCF9vcmRlcklkCQDMCAIJAQxCb29sZWFuRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRBrX2NhbmNlbGVkT3JkZXJzCQCkAwEFCF9vcmRlcklkBgUDbmlsCAFpAQpzZXRDb250ZXh0AQdfc2VuZGVyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIOT25seSBzZWxmLWNhbGwJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa19zZW5kZXIFB19zZW5kZXIFA25pbAFpAQxyZXNldENvbnRleHQAAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIOT25seSBzZWxmLWNhbGwJAMwIAgkBC0RlbGV0ZUVudHJ5AQUIa19zZW5kZXIFA25pbAFpAQppbml0aWFsaXplAQxfY29vcmRpbmF0b3IDCQELaW5pdGlhbGl6ZWQACQACAQITQWxyZWFkeSBpbml0aWFsaXplZAkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwUMX2Nvb3JkaW5hdG9yCQDMCAIJAQxCb29sZWFuRW50cnkCBQ1rX2luaXRpYWxpemVkBgUDbmlsAWkBC2NyZWF0ZU9yZGVyCARfYW1tBV90eXBlDV90cmlnZ2VyUHJpY2ULX2xpbWl0UHJpY2UJX2Ftb3VudEluCV9sZXZlcmFnZQVfc2lkZQhfcmVmTGluawMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAjVJbnZhbGlkIGNyZWF0ZU9yZGVyIHBhcmFtZXRlcnM6IGludmFsaWQgcGF5bWVudCBjb3VudAQLJHQwODAyMzgyNzUDCQAAAgkAkAMBCAUBaQhwYXltZW50cwABCQCUCgIJANgEAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQCEEludmFsaWQgYXNzZXQgaWQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CQCUCgICAAAABA5wYXltZW50QXNzZXRJZAgFCyR0MDgwMjM4Mjc1Al8xBA1wYXltZW50QW1vdW50CAULJHQwODAyMzgyNzUCXzIEBmRvQ2FsbAkA/AcEBQR0aGlzAhNpbnRlcm5hbENyZWF0ZU9yZGVyCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFBF9hbW0JAMwIAgUFX3R5cGUJAMwIAgUNX3RyaWdnZXJQcmljZQkAzAgCBQtfbGltaXRQcmljZQkAzAgCBQlfYW1vdW50SW4JAMwIAgUJX2xldmVyYWdlCQDMCAIFBV9zaWRlCQDMCAIFCF9yZWZMaW5rCQDMCAIFDnBheW1lbnRBc3NldElkCQDMCAIFDXBheW1lbnRBbW91bnQFA25pbAUDbmlsAwkAAAIFBmRvQ2FsbAUGZG9DYWxsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETaW50ZXJuYWxDcmVhdGVPcmRlcgsHX3RyYWRlcgRfYW1tBV90eXBlDV90cmlnZ2VyUHJpY2ULX2xpbWl0UHJpY2UJX2Ftb3VudEluCV9sZXZlcmFnZQVfc2lkZQhfcmVmTGluaw9fcGF5bWVudEFzc2V0SWQOX3BheW1lbnRBbW91bnQDAwMDAwMDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBC2lzV2hpdGVsaXN0AQUEX2FtbQYJAGcCAAAFDV90cmlnZ2VyUHJpY2UGCQBmAgAABQtfbGltaXRQcmljZQYJAGcCAAAFCV9hbW91bnRJbgYJAGYCAAAFCV9sZXZlcmFnZQYJAQEhAQMJAAACBQVfc2lkZQUETE9ORwYJAAACBQVfc2lkZQUFU0hPUlQGCQEBIQEDAwkAAAIFBV90eXBlBQRTVE9QBgkAAAIFBV90eXBlBQRUQUtFBgkAAAIFBV90eXBlBQVMSU1JVAYJAQEhAQkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECHkludmFsaWQgY3JlYXRlT3JkZXIgcGFyYW1ldGVycwQHb3JkZXJJZAkAZAIJAQ5jdXJyZW50T3JkZXJJZAAAAQQTbmV3VHJhZGVyT3JkZXJDb3VudAkAZAIJARNnZXRUcmFkZXJPcmRlckNvdW50AgUEX2FtbQUHX3RyYWRlcgABBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUCBQRfYW1tBQdfdHJhZGVyBApfZGlyZWN0aW9uAwMDCQAAAgUMcG9zaXRpb25TaXplAAAGAwkAZgIFDHBvc2l0aW9uU2l6ZQAACQAAAgUFX3NpZGUFBExPTkcHBgMJAGYCAAAFDHBvc2l0aW9uU2l6ZQkAAAIFBV9zaWRlBQVTSE9SVAcFCElOQ1JFQVNFBQhERUNSRUFTRQMDCQAAAgUMcG9zaXRpb25TaXplAAADCQAAAgUFX3R5cGUFBFNUT1AGCQAAAgUFX3R5cGUFBFRBS0UHCQACAQIrQ2FuIG5vdCBjcmVhdGUgU1RPUC9UQUtFIG9yZGVyOiBubyBwb3NpdGlvbgQLdXNkblBheW1lbnQDCQAAAgUKX2RpcmVjdGlvbgUISU5DUkVBU0UDAwkBAiE9AgUPX3BheW1lbnRBc3NldElkCQDYBAEJAQpxdW90ZUFzc2V0AAYJAQIhPQIFDl9wYXltZW50QW1vdW50BQlfYW1vdW50SW4JAAIBAjRJbnZhbGlkIGNyZWF0ZUxpbWl0T3JkZXIgcGFyYW1ldGVyczogaW52YWxpZCBwYXltZW50BAVzdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAUOX3BheW1lbnRBbW91bnQFA25pbAMJAAACBQVzdGFrZQUFc3Rha2UFDl9wYXltZW50QW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAADCQAAAgULdXNkblBheW1lbnQFC3VzZG5QYXltZW50BApwb3NpdGlvbklkAwkBAiE9AgUMcG9zaXRpb25TaXplAAAJAQ1nZXRQb3NpdGlvbklkAgUEX2FtbQUHX3RyYWRlcgAAAwkAZgIFE25ld1RyYWRlck9yZGVyQ291bnQFGU1BWF9UUkFERVJfT1JERVJTX1BFUl9BTU0JAAIBAjBJbnZhbGlkIGNyZWF0ZUxpbWl0T3JkZXIgcGFyYW1ldGVyczogb3JkZXIgY291bnQJAM4IAgkAzggCCQEJc2F2ZU9yZGVyDAUHb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgUJX2Ftb3VudEluBQlfbGV2ZXJhZ2UFBV90eXBlBQ1fdHJpZ2dlclByaWNlBQt1c2RuUGF5bWVudAUFX3NpZGUFCF9yZWZMaW5rBQpwb3NpdGlvbklkBQtfbGltaXRQcmljZQkBFnVwZGF0ZVRyYWRlck9yZGVyQ291bnQDBQRfYW1tBQdfdHJhZGVyBRNuZXdUcmFkZXJPcmRlckNvdW50CQERdXBkYXRlTGFzdE9yZGVySWQBBQdvcmRlcklkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NhbmNlbE9yZGVyAQhfb3JkZXJJZAQNJHQwMTEyMDUxMTQyNAkBCGdldE9yZGVyAQUIX29yZGVySWQEBF9hbW0IBQ0kdDAxMTIwNTExNDI0Al8xBAdfdHJhZGVyCAUNJHQwMTEyMDUxMTQyNAJfMgQJX2Ftb3VudEluCAUNJHQwMTEyMDUxMTQyNAJfMwQJX2xldmVyYWdlCAUNJHQwMTEyMDUxMTQyNAJfNAQFX3R5cGUIBQ0kdDAxMTIwNTExNDI0Al81BA1fdHJpZ2dlclByaWNlCAUNJHQwMTEyMDUxMTQyNAJfNgQLX2Ftb3VudFVzZG4IBQ0kdDAxMTIwNTExNDI0Al83BAVfc2lkZQgFDSR0MDExMjA1MTE0MjQCXzgECF9yZWZMaW5rCAUNJHQwMTEyMDUxMTQyNAJfOQQLX3Bvc2l0aW9uSWQIBQ0kdDAxMTIwNTExNDI0A18xMAQLX2xpbWl0UHJpY2UIBQ0kdDAxMTIwNTExNDI0A18xMQMDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQEHaXNWYWxpZAEFCF9vcmRlcklkBgkBASEBCQAAAgkApQgBCAUBaQZjYWxsZXIFB190cmFkZXIJAAIBAh5JbnZhbGlkIGNhbmNlbE9yZGVyIHBhcmFtZXRlcnMEE25ld1RyYWRlck9yZGVyQ291bnQJAGUCCQETZ2V0VHJhZGVyT3JkZXJDb3VudAIFBF9hbW0FB190cmFkZXIAAQQId2l0aGRyYXcDCQBmAgULX2Ftb3VudFVzZG4AAAQHdW5zdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAkAzAgCBQtfYW1vdW50VXNkbgUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUId2l0aGRyYXcFCHdpdGhkcmF3CQDOCAIJAM4IAgkBD21hcmtDYW5jZWxPcmRlcgEFCF9vcmRlcklkCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIFE25ld1RyYWRlck9yZGVyQ291bnQDCQBmAgULX2Ftb3VudFVzZG4AAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC19hbW91bnRVc2RuCQEKcXVvdGVBc3NldAAFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGV4ZWN1dGVPcmRlcgEIX29yZGVySWQEDSR0MDEyMjU3MTI0NzYJAQhnZXRPcmRlcgEFCF9vcmRlcklkBARfYW1tCAUNJHQwMTIyNTcxMjQ3NgJfMQQHX3RyYWRlcggFDSR0MDEyMjU3MTI0NzYCXzIECV9hbW91bnRJbggFDSR0MDEyMjU3MTI0NzYCXzMECV9sZXZlcmFnZQgFDSR0MDEyMjU3MTI0NzYCXzQEBV90eXBlCAUNJHQwMTIyNTcxMjQ3NgJfNQQNX3RyaWdnZXJQcmljZQgFDSR0MDEyMjU3MTI0NzYCXzYEC19hbW91bnRVc2RuCAUNJHQwMTIyNTcxMjQ3NgJfNwQFX3NpZGUIBQ0kdDAxMjI1NzEyNDc2Al84BAhfcmVmTGluawgFDSR0MDEyMjU3MTI0NzYCXzkEC19wb3NpdGlvbklkCAUNJHQwMTIyNTcxMjQ3NgNfMTAEC19saW1pdFByaWNlCAUNJHQwMTIyNTcxMjQ3NgNfMTEDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQEHaXNWYWxpZAEFCF9vcmRlcklkCQACAQIfSW52YWxpZCBleGVjdXRlT3JkZXIgcGFyYW1ldGVycwQMcG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAgUEX2FtbQUHX3RyYWRlcgQRY3VycmVudFBvc2l0aW9uSWQDCQECIT0CBQxwb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQCBQRfYW1tBQdfdHJhZGVyAAAEDSR0MDEyODAyMTY2MjMDCQAAAgUFX3R5cGUFBFNUT1AEEl9wb3NpdGlvbkRpcmVjdGlvbgMJAGYCBQxwb3NpdGlvblNpemUAAAUETE9ORwMJAGYCAAAFDHBvc2l0aW9uU2l6ZQUFU0hPUlQJAAIBAixDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogbm8gb3BlbiBwb3NpdGlvbgQLbWFya2V0UHJpY2UJAQ5nZXRNYXJrZXRQcmljZQEFBF9hbW0EDGlzRXhlY3V0YWJsZQMJAAACBQVfc2lkZQUSX3Bvc2l0aW9uRGlyZWN0aW9uCQACAQInQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IHJlZHVjZSBvbmx5AwkBAiE9AgURY3VycmVudFBvc2l0aW9uSWQFC19wb3NpdGlvbklkCQACAQIrQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IHBvc2l0aW9uIGNsb3NlZAMJAAACBRJfcG9zaXRpb25EaXJlY3Rpb24FBExPTkcJAGcCBQ1fdHJpZ2dlclByaWNlBQttYXJrZXRQcmljZQkAZwIFC21hcmtldFByaWNlBQ1fdHJpZ2dlclByaWNlAwUMaXNFeGVjdXRhYmxlCQCVCgMCDWNsb3NlUG9zaXRpb24JAMwIAgkBBG1pbnYCBQlfYW1vdW50SW4JAQNhYnMBBQxwb3NpdGlvblNpemUJAMwIAgkBBG11bGQCBQtfbGltaXRQcmljZQkBA2FicwEFDHBvc2l0aW9uU2l6ZQUDbmlsBQNuaWwJAAIBAjFDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogdHJpZ2dlclByaWNlIG1pc21hdGNoAwkAAAIFBV90eXBlBQRUQUtFBBJfcG9zaXRpb25EaXJlY3Rpb24DCQBmAgUMcG9zaXRpb25TaXplAAAFBExPTkcDCQBmAgAABQxwb3NpdGlvblNpemUFBVNIT1JUCQACAQIsQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IG5vIG9wZW4gcG9zaXRpb24EC21hcmtldFByaWNlCQEOZ2V0TWFya2V0UHJpY2UBBQRfYW1tBAxpc0V4ZWN1dGFibGUDCQAAAgUFX3NpZGUFEl9wb3NpdGlvbkRpcmVjdGlvbgkAAgECJ0NhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiByZWR1Y2Ugb25seQMJAQIhPQIFEWN1cnJlbnRQb3NpdGlvbklkBQtfcG9zaXRpb25JZAkAAgEJAKwCAgkArAICCQCsAgICLENhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiBwb3NpdGlvbiBjbG9zZWQgCQCkAwEFEWN1cnJlbnRQb3NpdGlvbklkAgIhPQkApAMBBQtfcG9zaXRpb25JZAMJAAACBRJfcG9zaXRpb25EaXJlY3Rpb24FBExPTkcJAGcCBQttYXJrZXRQcmljZQUNX3RyaWdnZXJQcmljZQkAZwIFDV90cmlnZ2VyUHJpY2UFC21hcmtldFByaWNlAwUMaXNFeGVjdXRhYmxlCQCVCgMCDWNsb3NlUG9zaXRpb24JAMwIAgkBBG1pbnYCBQlfYW1vdW50SW4JAQNhYnMBBQxwb3NpdGlvblNpemUJAMwIAgkBBG11bGQCBQtfbGltaXRQcmljZQkBA2FicwEFDHBvc2l0aW9uU2l6ZQUDbmlsBQNuaWwJAAIBAjFDYW4gbm90IGV4ZWN1dGUgVEFLRSBvcmRlcjogdHJpZ2dlclByaWNlIG1pc21hdGNoAwkAAAIFBV90eXBlBQVMSU1JVAQLbWFya2V0UHJpY2UJAQ5nZXRNYXJrZXRQcmljZQEFBF9hbW0EBnNwcmVhZAMJAAACBQtfbGltaXRQcmljZQAACQEJZ2V0U3ByZWFkAQUNX3RyaWdnZXJQcmljZQkBA2FicwEJAGUCBQ1fdHJpZ2dlclByaWNlBQtfbGltaXRQcmljZQQMaXNFeGVjdXRhYmxlAwkAZwIFC21hcmtldFByaWNlCQBlAgUNX3RyaWdnZXJQcmljZQUGc3ByZWFkCQBnAgkAZAIFDV90cmlnZ2VyUHJpY2UFBnNwcmVhZAULbWFya2V0UHJpY2UHAwUMaXNFeGVjdXRhYmxlBBJfcG9zaXRpb25EaXJlY3Rpb24DCQBmAgUMcG9zaXRpb25TaXplAAAFBExPTkcDCQBmAgAABQxwb3NpdGlvblNpemUFBVNIT1JUAP///////////wEECWRpcmVjdGlvbgMJAAACBQxwb3NpdGlvblNpemUAAAUISU5DUkVBU0UDCQAAAgUSX3Bvc2l0aW9uRGlyZWN0aW9uBQVfc2lkZQUISU5DUkVBU0UFCERFQ1JFQVNFAwkAAAIFCWRpcmVjdGlvbgUISU5DUkVBU0UED2Ftb3VudEluV2l0aEZlZQkAZQIFC19hbW91bnRVc2RuCQEEbXVsZAIFC19hbW91bnRVc2RuCQEGZ2V0RmVlAgUEX2FtbQUHX3RyYWRlcgkAlQoDAhBpbmNyZWFzZVBvc2l0aW9uCQDMCAIFBV9zaWRlCQDMCAIFCV9sZXZlcmFnZQkAzAgCAwkAAAIFC19saW1pdFByaWNlAAAAAAkBBGRpdmQCBQ9hbW91bnRJbldpdGhGZWUFC19saW1pdFByaWNlCQDMCAIFCF9yZWZMaW5rBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAULX2Ftb3VudFVzZG4FA25pbAkAlQoDAg1jbG9zZVBvc2l0aW9uCQDMCAIFCV9hbW91bnRJbgkAzAgCCQEEbXVsZAIFCV9hbW91bnRJbgULX2xpbWl0UHJpY2UFA25pbAUDbmlsCQACAQIyQ2FuIG5vdCBleGVjdXRlIExJTUlUIG9yZGVyOiB0cmlnZ2VyUHJpY2UgbWlzbWF0Y2gJAAIBCQCsAgICFEludmFsaWQgb3JkZXIgdHlwZTogCQCkAwEFBV90eXBlBAZtZXRob2QIBQ0kdDAxMjgwMjE2NjIzAl8xBARhcmdzCAUNJHQwMTI4MDIxNjYyMwJfMgQIcGF5bWVudHMIBQ0kdDAxMjgwMjE2NjIzAl8zBAh3aXRoZHJhdwMJAAACCQCQAwEFCHBheW1lbnRzAAEEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAggJAJEDAgUIcGF5bWVudHMAAAZhbW91bnQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwQMZG9TZXRDb250ZXh0CQD8BwQFBHRoaXMCCnNldENvbnRleHQJAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUMZG9TZXRDb250ZXh0BQxkb1NldENvbnRleHQED2RvQ2xvc2VQb3NpdGlvbgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tBQZtZXRob2QFBGFyZ3MFCHBheW1lbnRzAwkAAAIFD2RvQ2xvc2VQb3NpdGlvbgUPZG9DbG9zZVBvc2l0aW9uBA5kb1Jlc2V0Q29udGV4dAkA/AcEBQR0aGlzAgxyZXNldENvbnRleHQFA25pbAUDbmlsAwkAAAIFDmRvUmVzZXRDb250ZXh0BQ5kb1Jlc2V0Q29udGV4dAkBEG1hcmtFeGVjdXRlT3JkZXIBBQhfb3JkZXJJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARR2aWV3X2NhbkV4ZWN1dGVPcmRlcgEIX29yZGVySWQEAXMJAPwHBAUEdGhpcwIMZXhlY3V0ZU9yZGVyCQDMCAIFCF9vcmRlcklkBQNuaWwFA25pbAMJAAACBQFzBQFzCQACAQIHU3VjY2VzcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAJAQ5hZG1pblB1YmxpY0tleQBIBtW6", "height": 2351138, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DD4LroFKgFy71LTCYJrKN6ddxqGh7kHL7cVv4NZHNDVt Next: 9HEMv6NzTacEfbxV2S5MSzaPbbvk6qzzx3MmD4UrEe71 Diff:
OldNewDifferences
55
66 let b = "k_admin_public_key"
77
8-let c = "k_qtAstR"
8+let c = "k_quote_asset"
99
10-let d = "k_bsAstR"
10+let d = "k_amm"
1111
12-let e = "k_positionClosedDate"
12+let e = "k_manager_address"
1313
14-let f = "k_executedOrders"
14+let f = "k_positionSequence"
1515
16-let g = "k_sender"
16+let g = "k_positionSize"
1717
18-let h = "k_initialized"
18+let h = "k_fee"
1919
20-let i = 1
20+let i = "k_executedOrders"
2121
22-let j = 2
22+let j = "k_canceledOrders"
2323
24-let k = lastBlock.timestamp
24+let k = "k_order"
2525
26-let l = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
26+let l = "k_lastOrderId"
2727
28-func m (n,o) = fraction(n, l, o, HALFEVEN)
28+let m = "k_traderOrderCnt"
29+
30+let n = "k_sender"
31+
32+let o = "k_initialized"
33+
34+let p = 1
35+
36+let q = 2
37+
38+let r = 3
39+
40+let s = 1
41+
42+let t = 2
43+
44+let u = 1
45+
46+let v = 2
47+
48+let w = 5
49+
50+let x = lastBlock.timestamp
51+
52+let y = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
53+
54+let z = (y / 200)
55+
56+func A (B) = if ((B > 0))
57+ then B
58+ else -(B)
2959
3060
31-func p (n,o) = fraction(n, o, l, HALFEVEN)
61+func C (B,D) = fraction(B, y, D, HALFEVEN)
3262
3363
34-func q (r) = ((f + "_") + r)
64+func E (B,D) = fraction(B, D, y, HALFEVEN)
3565
3666
37-func s () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
67+func F (B,D) = if ((B > D))
68+ then D
69+ else B
3870
3971
40-func t () = fromBase58String(getStringValue(s(), b))
72+func G (H,I) = ((H + "_") + I)
4173
4274
43-func u () = valueOrElse(getBoolean(this, h), false)
75+func J (K) = ((i + "_") + toString(K))
4476
4577
46-func v (w,x,y,z) = {
47- let A = toBytes((w + x))
48- let B = fromBase58String(y)
49- let C = fromBase58String(z)
50- if (sigVerify(A, B, C))
51- then unit
52- else throw("Invalid order signature")
78+func L (K) = ((j + "_") + toString(K))
79+
80+
81+func M (K) = G(k, toString(K))
82+
83+
84+func N (O,P) = ((((m + "_") + O) + "_") + P)
85+
86+
87+func Q () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
88+
89+
90+func R () = fromBase58String(getStringValue(Q(), c))
91+
92+
93+func S () = valueOrErrorMessage(addressFromString(getStringValue(Q(), e)), "Manager not set")
94+
95+
96+func T (I) = valueOrElse(getBoolean(Q(), G(d, I)), false)
97+
98+
99+func U () = fromBase58String(getStringValue(Q(), b))
100+
101+
102+func V () = valueOrElse(getBoolean(this, o), false)
103+
104+
105+func W (K) = if (valueOrElse(getBoolean(this, J(K)), false))
106+ then throw(("Order already executed: " + toString(K)))
107+ else if (valueOrElse(getBoolean(this, L(K)), false))
108+ then throw(("Order already cancelled: " + toString(K)))
109+ else true
110+
111+
112+func X () = valueOrElse(getInteger(this, l), 0)
113+
114+
115+func Y (O,P) = {
116+ let Z = N(O, P)
117+ valueOrElse(getInteger(this, Z), 0)
53118 }
54119
55120
56-func D (r) = if (valueOrElse(getBoolean(this, q(r)), false))
57- then throw(("Order already executed: " + r))
58- else unit
121+func aa (K) = {
122+ let ab = valueOrErrorMessage(getString(this, M(K)), ("Invalid order id: " + toString(K)))
123+ let ac = split(ab, ",")
124+ let ad = ac[0]
125+ let ae = ac[1]
126+ let af = valueOrErrorMessage(parseInt(ac[2]), "Invalid amountIn")
127+ let ag = valueOrErrorMessage(parseInt(ac[3]), "Invalid leverage")
128+ let ah = valueOrErrorMessage(parseInt(ac[4]), "Invalid type")
129+ let ai = valueOrErrorMessage(parseInt(ac[5]), "Invalid triggerPrice")
130+ let aj = valueOrErrorMessage(parseInt(ac[6]), "Invalid paymentUsdn")
131+ let ak = valueOrErrorMessage(parseInt(ac[7]), "Invalid side")
132+ let al = ac[8]
133+ let am = valueOrErrorMessage(parseInt(ac[9]), "Invalid positionId")
134+ let an = valueOrErrorMessage(parseInt(ac[10]), "Invalid limitPrice")
135+ $Tuple11(ad, ae, af, ag, ah, ai, aj, ak, al, am, an)
136+ }
59137
60138
61-@Callable(E)
62-func setContext (F) = if ((E.caller != this))
63- then throw("Only self-call")
64- else [StringEntry(g, F)]
65-
66-
67-
68-@Callable(E)
69-func resetContext () = if ((E.caller != this))
70- then throw("Only self-call")
71- else [DeleteEntry(g)]
72-
73-
74-
75-@Callable(E)
76-func initialize (G) = if (u())
77- then throw("Already initialized")
78- else [StringEntry(a, G), BooleanEntry(h, true)]
79-
80-
81-
82-@Callable(E)
83-func executeOrder (w,x,y) = {
84- let H = split(x, ",")
85- let I = valueOrErrorMessage(parseInt(H[0]), "Invalid order data [type]")
86- let J = toBase58String(sha256(toBytes(x)))
87- let K = D(J)
88- if ((K == K))
89- then if (if ((I == i))
90- then true
91- else (I == j))
92- then {
93- let L = H[1]
94- let M = H[2]
95- let N = valueOrErrorMessage(parseInt(H[3]), "Invalid order data [price]")
96- let O = valueOrErrorMessage(parseInt(H[4]), "Invalid order data [timestamp]")
97- let P = valueOrErrorMessage(parseInt(H[5]), "Invalid order data [validDue]")
98- let Q = v(w, x, y, M)
99- if ((Q == Q))
139+func ao (O) = {
140+ let ap = invoke(addressFromStringValue(O), "computeSpotPrice", nil, nil)
141+ if ((ap == ap))
142+ then {
143+ let aq = {
144+ let ar = ap
145+ if ($isInstanceOf(ar, "Int"))
100146 then {
101- let R = valueOrErrorMessage(addressFromString(L), "Invalid order data [amm]")
102- let S = getIntegerValue(R, c)
103- let T = getIntegerValue(R, d)
104- let U = m(S, T)
105- let V = if ((I == i))
106- then (U >= N)
107- else (N >= U)
108- let W = if (!(V))
109- then throw(((("Can not execute order [price]: AMM Price=" + toString(U)) + " Order Price=") + toString(N)))
110- else unit
111- if ((W == W))
112- then {
113- let X = if ((P == 0))
114- then true
115- else (P >= k)
116- let Y = if (!(X))
117- then throw(((("Can not execute order [due]: Due=" + toString(P)) + " Time=") + toString(k)))
118- else unit
119- if ((Y == Y))
120- then {
121- let Z = toString(addressFromPublicKey(fromBase58String(M)))
122- let aa = valueOrElse(getInteger(R, ((e + "_") + Z)), 0)
123- let ab = (O >= aa)
124- let ac = if (!(ab))
125- then throw(((("Can not execute order [position closed]: Order Created=" + toString(O)) + " Position Closed=") + toString(aa)))
126- else unit
127- if ((ac == ac))
128- then if (if (if (V)
129- then X
130- else false)
131- then ab
132- else false)
133- then {
134- let ad = invoke(this, "setContext", [Z], nil)
135- if ((ad == ad))
136- then {
137- let ae = invoke(R, "closePosition", nil, nil)
138- if ((ae == ae))
139- then {
140- let af = invoke(this, "resetContext", nil, nil)
141- if ((af == af))
142- then [BooleanEntry(q(J), true)]
143- else throw("Strict value is not equal to itself.")
144- }
145- else throw("Strict value is not equal to itself.")
146- }
147- else throw("Strict value is not equal to itself.")
148- }
149- else throw("Invalid order execution timing")
150- else throw("Strict value is not equal to itself.")
151- }
152- else throw("Strict value is not equal to itself.")
153- }
154- else throw("Strict value is not equal to itself.")
147+ let as = ar
148+ as
155149 }
156- else throw("Strict value is not equal to itself.")
150+ else throw("Invalid computeSpotPrice result")
157151 }
158- else throw(("Invalid order type: " + toString(I)))
152+ value(aq)
153+ }
159154 else throw("Strict value is not equal to itself.")
160155 }
161156
162157
163-@Verifier(ag)
164-func ah () = sigVerify(ag.bodyBytes, ag.proofs[0], t())
158+func at (O,P) = {
159+ let ap = invoke(addressFromStringValue(O), "computeFeeForTraderWithArtifact", [P, ""], nil)
160+ if ((ap == ap))
161+ then {
162+ let aq = {
163+ let ar = ap
164+ if ($isInstanceOf(ar, "(Int, Boolean)"))
165+ then {
166+ let as = ar
167+ as._1
168+ }
169+ else throw("Invalid computeFeeForTraderWithArtifact result")
170+ }
171+ value(aq)
172+ }
173+ else throw("Strict value is not equal to itself.")
174+ }
175+
176+
177+func au (O,P) = {
178+ let ad = addressFromStringValue(O)
179+ let av = G(g, P)
180+ valueOrElse(getInteger(ad, av), 0)
181+ }
182+
183+
184+func aw (O,P) = {
185+ let ad = addressFromStringValue(O)
186+ let ax = G(f, P)
187+ valueOrElse(getInteger(ad, ax), 0)
188+ }
189+
190+
191+func ay (az) = E(az, z)
192+
193+
194+func aA (K,O,P,aB,aC,aD,aE,aF,aG,aH,aI,aJ) = {
195+ let ab = makeString([O, P, toString(aB), toString(aC), toString(aD), toString(aE), toString(aF), toString(aG), aH, toString(aI), toString(aJ)], ",")
196+[StringEntry(M(K), ab)]
197+ }
198+
199+
200+func aK (O,P,aL) = [IntegerEntry(N(O, P), aL)]
201+
202+
203+func aM (aN) = [IntegerEntry(l, aN)]
204+
205+
206+func aO (K) = [BooleanEntry(G(i, toString(K)), true)]
207+
208+
209+func aP (K) = [BooleanEntry(G(j, toString(K)), true)]
210+
211+
212+@Callable(aQ)
213+func setContext (aR) = if ((aQ.caller != this))
214+ then throw("Only self-call")
215+ else [StringEntry(n, aR)]
216+
217+
218+
219+@Callable(aQ)
220+func resetContext () = if ((aQ.caller != this))
221+ then throw("Only self-call")
222+ else [DeleteEntry(n)]
223+
224+
225+
226+@Callable(aQ)
227+func initialize (aS) = if (V())
228+ then throw("Already initialized")
229+ else [StringEntry(a, aS), BooleanEntry(o, true)]
230+
231+
232+
233+@Callable(aQ)
234+func createOrder (O,aD,aE,aJ,aB,aC,aG,aH) = if ((size(aQ.payments) > 1))
235+ then throw("Invalid createOrder parameters: invalid payment count")
236+ else {
237+ let aT = if ((size(aQ.payments) == 1))
238+ then $Tuple2(toBase58String(valueOrErrorMessage(aQ.payments[0].assetId, "Invalid asset id")), aQ.payments[0].amount)
239+ else $Tuple2("", 0)
240+ let aU = aT._1
241+ let aV = aT._2
242+ let aW = invoke(this, "internalCreateOrder", [toString(aQ.caller), O, aD, aE, aJ, aB, aC, aG, aH, aU, aV], nil)
243+ if ((aW == aW))
244+ then nil
245+ else throw("Strict value is not equal to itself.")
246+ }
247+
248+
249+
250+@Callable(aQ)
251+func internalCreateOrder (P,O,aD,aE,aJ,aB,aC,aG,aH,aX,aY) = if (if (if (if (if (if (if (if (if (!(V()))
252+ then true
253+ else !(T(O)))
254+ then true
255+ else (0 >= aE))
256+ then true
257+ else (0 > aJ))
258+ then true
259+ else (0 >= aB))
260+ then true
261+ else (0 > aC))
262+ then true
263+ else !(if ((aG == s))
264+ then true
265+ else (aG == t)))
266+ then true
267+ else !(if (if ((aD == p))
268+ then true
269+ else (aD == q))
270+ then true
271+ else (aD == r)))
272+ then true
273+ else !((aQ.caller == this)))
274+ then throw("Invalid createOrder parameters")
275+ else {
276+ let aZ = (X() + 1)
277+ let ba = (Y(O, P) + 1)
278+ let bb = au(O, P)
279+ let bc = if (if (if ((bb == 0))
280+ then true
281+ else if ((bb > 0))
282+ then (aG == s)
283+ else false)
284+ then true
285+ else if ((0 > bb))
286+ then (aG == t)
287+ else false)
288+ then u
289+ else v
290+ if (if ((bb == 0))
291+ then if ((aD == p))
292+ then true
293+ else (aD == q)
294+ else false)
295+ then throw("Can not create STOP/TAKE order: no position")
296+ else {
297+ let bd = if ((bc == u))
298+ then if (if ((aX != toBase58String(R())))
299+ then true
300+ else (aY != aB))
301+ then throw("Invalid createLimitOrder parameters: invalid payment")
302+ else {
303+ let be = invoke(S(), "deposit", nil, [AttachedPayment(R(), aY)])
304+ if ((be == be))
305+ then aY
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ else 0
309+ if ((bd == bd))
310+ then {
311+ let am = if ((bb != 0))
312+ then aw(O, P)
313+ else 0
314+ if ((ba > w))
315+ then throw("Invalid createLimitOrder parameters: order count")
316+ else ((aA(aZ, O, P, aB, aC, aD, aE, bd, aG, aH, am, aJ) ++ aK(O, P, ba)) ++ aM(aZ))
317+ }
318+ else throw("Strict value is not equal to itself.")
319+ }
320+ }
321+
322+
323+
324+@Callable(aQ)
325+func cancelOrder (K) = {
326+ let bf = aa(K)
327+ let O = bf._1
328+ let P = bf._2
329+ let aB = bf._3
330+ let aC = bf._4
331+ let aD = bf._5
332+ let aE = bf._6
333+ let bg = bf._7
334+ let aG = bf._8
335+ let aH = bf._9
336+ let aI = bf._10
337+ let aJ = bf._11
338+ if (if (if (!(V()))
339+ then true
340+ else !(W(K)))
341+ then true
342+ else !((toString(aQ.caller) == P)))
343+ then throw("Invalid cancelOrder parameters")
344+ else {
345+ let ba = (Y(O, P) - 1)
346+ let bh = if ((bg > 0))
347+ then {
348+ let bi = invoke(S(), "withdraw", [toBase58String(R()), bg], nil)
349+ if ((bi == bi))
350+ then nil
351+ else throw("Strict value is not equal to itself.")
352+ }
353+ else nil
354+ if ((bh == bh))
355+ then ((aP(K) ++ aK(O, P, ba)) ++ (if ((bg > 0))
356+ then [ScriptTransfer(aQ.caller, bg, R())]
357+ else nil))
358+ else throw("Strict value is not equal to itself.")
359+ }
360+ }
361+
362+
363+
364+@Callable(aQ)
365+func executeOrder (K) = {
366+ let bj = aa(K)
367+ let O = bj._1
368+ let P = bj._2
369+ let aB = bj._3
370+ let aC = bj._4
371+ let aD = bj._5
372+ let aE = bj._6
373+ let bg = bj._7
374+ let aG = bj._8
375+ let aH = bj._9
376+ let aI = bj._10
377+ let aJ = bj._11
378+ if (if (!(V()))
379+ then true
380+ else !(W(K)))
381+ then throw("Invalid executeOrder parameters")
382+ else {
383+ let bb = au(O, P)
384+ let bk = if ((bb != 0))
385+ then aw(O, P)
386+ else 0
387+ let bl = if ((aD == p))
388+ then {
389+ let bm = if ((bb > 0))
390+ then s
391+ else if ((0 > bb))
392+ then t
393+ else throw("Can not execute STOP order: no open position")
394+ let bn = ao(O)
395+ let bo = if ((aG == bm))
396+ then throw("Can not execute STOP order: reduce only")
397+ else if ((bk != aI))
398+ then throw("Can not execute STOP order: position closed")
399+ else if ((bm == s))
400+ then (aE >= bn)
401+ else (bn >= aE)
402+ if (bo)
403+ then $Tuple3("closePosition", [F(aB, A(bb)), E(aJ, A(bb))], nil)
404+ else throw("Can not execute STOP order: triggerPrice mismatch")
405+ }
406+ else if ((aD == q))
407+ then {
408+ let bm = if ((bb > 0))
409+ then s
410+ else if ((0 > bb))
411+ then t
412+ else throw("Can not execute STOP order: no open position")
413+ let bn = ao(O)
414+ let bo = if ((aG == bm))
415+ then throw("Can not execute TAKE order: reduce only")
416+ else if ((bk != aI))
417+ then throw(((("Can not execute TAKE order: position closed " + toString(bk)) + "!=") + toString(aI)))
418+ else if ((bm == s))
419+ then (bn >= aE)
420+ else (aE >= bn)
421+ if (bo)
422+ then $Tuple3("closePosition", [F(aB, A(bb)), E(aJ, A(bb))], nil)
423+ else throw("Can not execute TAKE order: triggerPrice mismatch")
424+ }
425+ else if ((aD == r))
426+ then {
427+ let bn = ao(O)
428+ let bp = if ((aJ == 0))
429+ then ay(aE)
430+ else A((aE - aJ))
431+ let bo = if ((bn >= (aE - bp)))
432+ then ((aE + bp) >= bn)
433+ else false
434+ if (bo)
435+ then {
436+ let bm = if ((bb > 0))
437+ then s
438+ else if ((0 > bb))
439+ then t
440+ else -1
441+ let bq = if ((bb == 0))
442+ then u
443+ else if ((bm == aG))
444+ then u
445+ else v
446+ if ((bq == u))
447+ then {
448+ let br = (bg - E(bg, at(O, P)))
449+ $Tuple3("increasePosition", [aG, aC, if ((aJ == 0))
450+ then 0
451+ else C(br, aJ), aH], [AttachedPayment(R(), bg)])
452+ }
453+ else $Tuple3("closePosition", [aB, E(aB, aJ)], nil)
454+ }
455+ else throw("Can not execute LIMIT order: triggerPrice mismatch")
456+ }
457+ else throw(("Invalid order type: " + toString(aD)))
458+ let bs = bl._1
459+ let bt = bl._2
460+ let bu = bl._3
461+ let bh = if ((size(bu) == 1))
462+ then {
463+ let bi = invoke(S(), "withdraw", [toBase58String(R()), bu[0].amount], nil)
464+ if ((bi == bi))
465+ then nil
466+ else throw("Strict value is not equal to itself.")
467+ }
468+ else nil
469+ if ((bh == bh))
470+ then {
471+ let bv = invoke(this, "setContext", [P], nil)
472+ if ((bv == bv))
473+ then {
474+ let bw = invoke(addressFromStringValue(O), bs, bt, bu)
475+ if ((bw == bw))
476+ then {
477+ let bx = invoke(this, "resetContext", nil, nil)
478+ if ((bx == bx))
479+ then aO(K)
480+ else throw("Strict value is not equal to itself.")
481+ }
482+ else throw("Strict value is not equal to itself.")
483+ }
484+ else throw("Strict value is not equal to itself.")
485+ }
486+ else throw("Strict value is not equal to itself.")
487+ }
488+ }
489+
490+
491+
492+@Callable(aQ)
493+func view_canExecuteOrder (K) = {
494+ let ap = invoke(this, "executeOrder", [K], nil)
495+ if ((ap == ap))
496+ then throw("Success")
497+ else throw("Strict value is not equal to itself.")
498+ }
499+
500+
501+@Verifier(by)
502+func bz () = sigVerify(by.bodyBytes, by.proofs[0], U())
165503
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_coordinatorAddress"
55
66 let b = "k_admin_public_key"
77
8-let c = "k_qtAstR"
8+let c = "k_quote_asset"
99
10-let d = "k_bsAstR"
10+let d = "k_amm"
1111
12-let e = "k_positionClosedDate"
12+let e = "k_manager_address"
1313
14-let f = "k_executedOrders"
14+let f = "k_positionSequence"
1515
16-let g = "k_sender"
16+let g = "k_positionSize"
1717
18-let h = "k_initialized"
18+let h = "k_fee"
1919
20-let i = 1
20+let i = "k_executedOrders"
2121
22-let j = 2
22+let j = "k_canceledOrders"
2323
24-let k = lastBlock.timestamp
24+let k = "k_order"
2525
26-let l = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
26+let l = "k_lastOrderId"
2727
28-func m (n,o) = fraction(n, l, o, HALFEVEN)
28+let m = "k_traderOrderCnt"
29+
30+let n = "k_sender"
31+
32+let o = "k_initialized"
33+
34+let p = 1
35+
36+let q = 2
37+
38+let r = 3
39+
40+let s = 1
41+
42+let t = 2
43+
44+let u = 1
45+
46+let v = 2
47+
48+let w = 5
49+
50+let x = lastBlock.timestamp
51+
52+let y = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
53+
54+let z = (y / 200)
55+
56+func A (B) = if ((B > 0))
57+ then B
58+ else -(B)
2959
3060
31-func p (n,o) = fraction(n, o, l, HALFEVEN)
61+func C (B,D) = fraction(B, y, D, HALFEVEN)
3262
3363
34-func q (r) = ((f + "_") + r)
64+func E (B,D) = fraction(B, D, y, HALFEVEN)
3565
3666
37-func s () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
67+func F (B,D) = if ((B > D))
68+ then D
69+ else B
3870
3971
40-func t () = fromBase58String(getStringValue(s(), b))
72+func G (H,I) = ((H + "_") + I)
4173
4274
43-func u () = valueOrElse(getBoolean(this, h), false)
75+func J (K) = ((i + "_") + toString(K))
4476
4577
46-func v (w,x,y,z) = {
47- let A = toBytes((w + x))
48- let B = fromBase58String(y)
49- let C = fromBase58String(z)
50- if (sigVerify(A, B, C))
51- then unit
52- else throw("Invalid order signature")
78+func L (K) = ((j + "_") + toString(K))
79+
80+
81+func M (K) = G(k, toString(K))
82+
83+
84+func N (O,P) = ((((m + "_") + O) + "_") + P)
85+
86+
87+func Q () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
88+
89+
90+func R () = fromBase58String(getStringValue(Q(), c))
91+
92+
93+func S () = valueOrErrorMessage(addressFromString(getStringValue(Q(), e)), "Manager not set")
94+
95+
96+func T (I) = valueOrElse(getBoolean(Q(), G(d, I)), false)
97+
98+
99+func U () = fromBase58String(getStringValue(Q(), b))
100+
101+
102+func V () = valueOrElse(getBoolean(this, o), false)
103+
104+
105+func W (K) = if (valueOrElse(getBoolean(this, J(K)), false))
106+ then throw(("Order already executed: " + toString(K)))
107+ else if (valueOrElse(getBoolean(this, L(K)), false))
108+ then throw(("Order already cancelled: " + toString(K)))
109+ else true
110+
111+
112+func X () = valueOrElse(getInteger(this, l), 0)
113+
114+
115+func Y (O,P) = {
116+ let Z = N(O, P)
117+ valueOrElse(getInteger(this, Z), 0)
53118 }
54119
55120
56-func D (r) = if (valueOrElse(getBoolean(this, q(r)), false))
57- then throw(("Order already executed: " + r))
58- else unit
121+func aa (K) = {
122+ let ab = valueOrErrorMessage(getString(this, M(K)), ("Invalid order id: " + toString(K)))
123+ let ac = split(ab, ",")
124+ let ad = ac[0]
125+ let ae = ac[1]
126+ let af = valueOrErrorMessage(parseInt(ac[2]), "Invalid amountIn")
127+ let ag = valueOrErrorMessage(parseInt(ac[3]), "Invalid leverage")
128+ let ah = valueOrErrorMessage(parseInt(ac[4]), "Invalid type")
129+ let ai = valueOrErrorMessage(parseInt(ac[5]), "Invalid triggerPrice")
130+ let aj = valueOrErrorMessage(parseInt(ac[6]), "Invalid paymentUsdn")
131+ let ak = valueOrErrorMessage(parseInt(ac[7]), "Invalid side")
132+ let al = ac[8]
133+ let am = valueOrErrorMessage(parseInt(ac[9]), "Invalid positionId")
134+ let an = valueOrErrorMessage(parseInt(ac[10]), "Invalid limitPrice")
135+ $Tuple11(ad, ae, af, ag, ah, ai, aj, ak, al, am, an)
136+ }
59137
60138
61-@Callable(E)
62-func setContext (F) = if ((E.caller != this))
63- then throw("Only self-call")
64- else [StringEntry(g, F)]
65-
66-
67-
68-@Callable(E)
69-func resetContext () = if ((E.caller != this))
70- then throw("Only self-call")
71- else [DeleteEntry(g)]
72-
73-
74-
75-@Callable(E)
76-func initialize (G) = if (u())
77- then throw("Already initialized")
78- else [StringEntry(a, G), BooleanEntry(h, true)]
79-
80-
81-
82-@Callable(E)
83-func executeOrder (w,x,y) = {
84- let H = split(x, ",")
85- let I = valueOrErrorMessage(parseInt(H[0]), "Invalid order data [type]")
86- let J = toBase58String(sha256(toBytes(x)))
87- let K = D(J)
88- if ((K == K))
89- then if (if ((I == i))
90- then true
91- else (I == j))
92- then {
93- let L = H[1]
94- let M = H[2]
95- let N = valueOrErrorMessage(parseInt(H[3]), "Invalid order data [price]")
96- let O = valueOrErrorMessage(parseInt(H[4]), "Invalid order data [timestamp]")
97- let P = valueOrErrorMessage(parseInt(H[5]), "Invalid order data [validDue]")
98- let Q = v(w, x, y, M)
99- if ((Q == Q))
139+func ao (O) = {
140+ let ap = invoke(addressFromStringValue(O), "computeSpotPrice", nil, nil)
141+ if ((ap == ap))
142+ then {
143+ let aq = {
144+ let ar = ap
145+ if ($isInstanceOf(ar, "Int"))
100146 then {
101- let R = valueOrErrorMessage(addressFromString(L), "Invalid order data [amm]")
102- let S = getIntegerValue(R, c)
103- let T = getIntegerValue(R, d)
104- let U = m(S, T)
105- let V = if ((I == i))
106- then (U >= N)
107- else (N >= U)
108- let W = if (!(V))
109- then throw(((("Can not execute order [price]: AMM Price=" + toString(U)) + " Order Price=") + toString(N)))
110- else unit
111- if ((W == W))
112- then {
113- let X = if ((P == 0))
114- then true
115- else (P >= k)
116- let Y = if (!(X))
117- then throw(((("Can not execute order [due]: Due=" + toString(P)) + " Time=") + toString(k)))
118- else unit
119- if ((Y == Y))
120- then {
121- let Z = toString(addressFromPublicKey(fromBase58String(M)))
122- let aa = valueOrElse(getInteger(R, ((e + "_") + Z)), 0)
123- let ab = (O >= aa)
124- let ac = if (!(ab))
125- then throw(((("Can not execute order [position closed]: Order Created=" + toString(O)) + " Position Closed=") + toString(aa)))
126- else unit
127- if ((ac == ac))
128- then if (if (if (V)
129- then X
130- else false)
131- then ab
132- else false)
133- then {
134- let ad = invoke(this, "setContext", [Z], nil)
135- if ((ad == ad))
136- then {
137- let ae = invoke(R, "closePosition", nil, nil)
138- if ((ae == ae))
139- then {
140- let af = invoke(this, "resetContext", nil, nil)
141- if ((af == af))
142- then [BooleanEntry(q(J), true)]
143- else throw("Strict value is not equal to itself.")
144- }
145- else throw("Strict value is not equal to itself.")
146- }
147- else throw("Strict value is not equal to itself.")
148- }
149- else throw("Invalid order execution timing")
150- else throw("Strict value is not equal to itself.")
151- }
152- else throw("Strict value is not equal to itself.")
153- }
154- else throw("Strict value is not equal to itself.")
147+ let as = ar
148+ as
155149 }
156- else throw("Strict value is not equal to itself.")
150+ else throw("Invalid computeSpotPrice result")
157151 }
158- else throw(("Invalid order type: " + toString(I)))
152+ value(aq)
153+ }
159154 else throw("Strict value is not equal to itself.")
160155 }
161156
162157
163-@Verifier(ag)
164-func ah () = sigVerify(ag.bodyBytes, ag.proofs[0], t())
158+func at (O,P) = {
159+ let ap = invoke(addressFromStringValue(O), "computeFeeForTraderWithArtifact", [P, ""], nil)
160+ if ((ap == ap))
161+ then {
162+ let aq = {
163+ let ar = ap
164+ if ($isInstanceOf(ar, "(Int, Boolean)"))
165+ then {
166+ let as = ar
167+ as._1
168+ }
169+ else throw("Invalid computeFeeForTraderWithArtifact result")
170+ }
171+ value(aq)
172+ }
173+ else throw("Strict value is not equal to itself.")
174+ }
175+
176+
177+func au (O,P) = {
178+ let ad = addressFromStringValue(O)
179+ let av = G(g, P)
180+ valueOrElse(getInteger(ad, av), 0)
181+ }
182+
183+
184+func aw (O,P) = {
185+ let ad = addressFromStringValue(O)
186+ let ax = G(f, P)
187+ valueOrElse(getInteger(ad, ax), 0)
188+ }
189+
190+
191+func ay (az) = E(az, z)
192+
193+
194+func aA (K,O,P,aB,aC,aD,aE,aF,aG,aH,aI,aJ) = {
195+ let ab = makeString([O, P, toString(aB), toString(aC), toString(aD), toString(aE), toString(aF), toString(aG), aH, toString(aI), toString(aJ)], ",")
196+[StringEntry(M(K), ab)]
197+ }
198+
199+
200+func aK (O,P,aL) = [IntegerEntry(N(O, P), aL)]
201+
202+
203+func aM (aN) = [IntegerEntry(l, aN)]
204+
205+
206+func aO (K) = [BooleanEntry(G(i, toString(K)), true)]
207+
208+
209+func aP (K) = [BooleanEntry(G(j, toString(K)), true)]
210+
211+
212+@Callable(aQ)
213+func setContext (aR) = if ((aQ.caller != this))
214+ then throw("Only self-call")
215+ else [StringEntry(n, aR)]
216+
217+
218+
219+@Callable(aQ)
220+func resetContext () = if ((aQ.caller != this))
221+ then throw("Only self-call")
222+ else [DeleteEntry(n)]
223+
224+
225+
226+@Callable(aQ)
227+func initialize (aS) = if (V())
228+ then throw("Already initialized")
229+ else [StringEntry(a, aS), BooleanEntry(o, true)]
230+
231+
232+
233+@Callable(aQ)
234+func createOrder (O,aD,aE,aJ,aB,aC,aG,aH) = if ((size(aQ.payments) > 1))
235+ then throw("Invalid createOrder parameters: invalid payment count")
236+ else {
237+ let aT = if ((size(aQ.payments) == 1))
238+ then $Tuple2(toBase58String(valueOrErrorMessage(aQ.payments[0].assetId, "Invalid asset id")), aQ.payments[0].amount)
239+ else $Tuple2("", 0)
240+ let aU = aT._1
241+ let aV = aT._2
242+ let aW = invoke(this, "internalCreateOrder", [toString(aQ.caller), O, aD, aE, aJ, aB, aC, aG, aH, aU, aV], nil)
243+ if ((aW == aW))
244+ then nil
245+ else throw("Strict value is not equal to itself.")
246+ }
247+
248+
249+
250+@Callable(aQ)
251+func internalCreateOrder (P,O,aD,aE,aJ,aB,aC,aG,aH,aX,aY) = if (if (if (if (if (if (if (if (if (!(V()))
252+ then true
253+ else !(T(O)))
254+ then true
255+ else (0 >= aE))
256+ then true
257+ else (0 > aJ))
258+ then true
259+ else (0 >= aB))
260+ then true
261+ else (0 > aC))
262+ then true
263+ else !(if ((aG == s))
264+ then true
265+ else (aG == t)))
266+ then true
267+ else !(if (if ((aD == p))
268+ then true
269+ else (aD == q))
270+ then true
271+ else (aD == r)))
272+ then true
273+ else !((aQ.caller == this)))
274+ then throw("Invalid createOrder parameters")
275+ else {
276+ let aZ = (X() + 1)
277+ let ba = (Y(O, P) + 1)
278+ let bb = au(O, P)
279+ let bc = if (if (if ((bb == 0))
280+ then true
281+ else if ((bb > 0))
282+ then (aG == s)
283+ else false)
284+ then true
285+ else if ((0 > bb))
286+ then (aG == t)
287+ else false)
288+ then u
289+ else v
290+ if (if ((bb == 0))
291+ then if ((aD == p))
292+ then true
293+ else (aD == q)
294+ else false)
295+ then throw("Can not create STOP/TAKE order: no position")
296+ else {
297+ let bd = if ((bc == u))
298+ then if (if ((aX != toBase58String(R())))
299+ then true
300+ else (aY != aB))
301+ then throw("Invalid createLimitOrder parameters: invalid payment")
302+ else {
303+ let be = invoke(S(), "deposit", nil, [AttachedPayment(R(), aY)])
304+ if ((be == be))
305+ then aY
306+ else throw("Strict value is not equal to itself.")
307+ }
308+ else 0
309+ if ((bd == bd))
310+ then {
311+ let am = if ((bb != 0))
312+ then aw(O, P)
313+ else 0
314+ if ((ba > w))
315+ then throw("Invalid createLimitOrder parameters: order count")
316+ else ((aA(aZ, O, P, aB, aC, aD, aE, bd, aG, aH, am, aJ) ++ aK(O, P, ba)) ++ aM(aZ))
317+ }
318+ else throw("Strict value is not equal to itself.")
319+ }
320+ }
321+
322+
323+
324+@Callable(aQ)
325+func cancelOrder (K) = {
326+ let bf = aa(K)
327+ let O = bf._1
328+ let P = bf._2
329+ let aB = bf._3
330+ let aC = bf._4
331+ let aD = bf._5
332+ let aE = bf._6
333+ let bg = bf._7
334+ let aG = bf._8
335+ let aH = bf._9
336+ let aI = bf._10
337+ let aJ = bf._11
338+ if (if (if (!(V()))
339+ then true
340+ else !(W(K)))
341+ then true
342+ else !((toString(aQ.caller) == P)))
343+ then throw("Invalid cancelOrder parameters")
344+ else {
345+ let ba = (Y(O, P) - 1)
346+ let bh = if ((bg > 0))
347+ then {
348+ let bi = invoke(S(), "withdraw", [toBase58String(R()), bg], nil)
349+ if ((bi == bi))
350+ then nil
351+ else throw("Strict value is not equal to itself.")
352+ }
353+ else nil
354+ if ((bh == bh))
355+ then ((aP(K) ++ aK(O, P, ba)) ++ (if ((bg > 0))
356+ then [ScriptTransfer(aQ.caller, bg, R())]
357+ else nil))
358+ else throw("Strict value is not equal to itself.")
359+ }
360+ }
361+
362+
363+
364+@Callable(aQ)
365+func executeOrder (K) = {
366+ let bj = aa(K)
367+ let O = bj._1
368+ let P = bj._2
369+ let aB = bj._3
370+ let aC = bj._4
371+ let aD = bj._5
372+ let aE = bj._6
373+ let bg = bj._7
374+ let aG = bj._8
375+ let aH = bj._9
376+ let aI = bj._10
377+ let aJ = bj._11
378+ if (if (!(V()))
379+ then true
380+ else !(W(K)))
381+ then throw("Invalid executeOrder parameters")
382+ else {
383+ let bb = au(O, P)
384+ let bk = if ((bb != 0))
385+ then aw(O, P)
386+ else 0
387+ let bl = if ((aD == p))
388+ then {
389+ let bm = if ((bb > 0))
390+ then s
391+ else if ((0 > bb))
392+ then t
393+ else throw("Can not execute STOP order: no open position")
394+ let bn = ao(O)
395+ let bo = if ((aG == bm))
396+ then throw("Can not execute STOP order: reduce only")
397+ else if ((bk != aI))
398+ then throw("Can not execute STOP order: position closed")
399+ else if ((bm == s))
400+ then (aE >= bn)
401+ else (bn >= aE)
402+ if (bo)
403+ then $Tuple3("closePosition", [F(aB, A(bb)), E(aJ, A(bb))], nil)
404+ else throw("Can not execute STOP order: triggerPrice mismatch")
405+ }
406+ else if ((aD == q))
407+ then {
408+ let bm = if ((bb > 0))
409+ then s
410+ else if ((0 > bb))
411+ then t
412+ else throw("Can not execute STOP order: no open position")
413+ let bn = ao(O)
414+ let bo = if ((aG == bm))
415+ then throw("Can not execute TAKE order: reduce only")
416+ else if ((bk != aI))
417+ then throw(((("Can not execute TAKE order: position closed " + toString(bk)) + "!=") + toString(aI)))
418+ else if ((bm == s))
419+ then (bn >= aE)
420+ else (aE >= bn)
421+ if (bo)
422+ then $Tuple3("closePosition", [F(aB, A(bb)), E(aJ, A(bb))], nil)
423+ else throw("Can not execute TAKE order: triggerPrice mismatch")
424+ }
425+ else if ((aD == r))
426+ then {
427+ let bn = ao(O)
428+ let bp = if ((aJ == 0))
429+ then ay(aE)
430+ else A((aE - aJ))
431+ let bo = if ((bn >= (aE - bp)))
432+ then ((aE + bp) >= bn)
433+ else false
434+ if (bo)
435+ then {
436+ let bm = if ((bb > 0))
437+ then s
438+ else if ((0 > bb))
439+ then t
440+ else -1
441+ let bq = if ((bb == 0))
442+ then u
443+ else if ((bm == aG))
444+ then u
445+ else v
446+ if ((bq == u))
447+ then {
448+ let br = (bg - E(bg, at(O, P)))
449+ $Tuple3("increasePosition", [aG, aC, if ((aJ == 0))
450+ then 0
451+ else C(br, aJ), aH], [AttachedPayment(R(), bg)])
452+ }
453+ else $Tuple3("closePosition", [aB, E(aB, aJ)], nil)
454+ }
455+ else throw("Can not execute LIMIT order: triggerPrice mismatch")
456+ }
457+ else throw(("Invalid order type: " + toString(aD)))
458+ let bs = bl._1
459+ let bt = bl._2
460+ let bu = bl._3
461+ let bh = if ((size(bu) == 1))
462+ then {
463+ let bi = invoke(S(), "withdraw", [toBase58String(R()), bu[0].amount], nil)
464+ if ((bi == bi))
465+ then nil
466+ else throw("Strict value is not equal to itself.")
467+ }
468+ else nil
469+ if ((bh == bh))
470+ then {
471+ let bv = invoke(this, "setContext", [P], nil)
472+ if ((bv == bv))
473+ then {
474+ let bw = invoke(addressFromStringValue(O), bs, bt, bu)
475+ if ((bw == bw))
476+ then {
477+ let bx = invoke(this, "resetContext", nil, nil)
478+ if ((bx == bx))
479+ then aO(K)
480+ else throw("Strict value is not equal to itself.")
481+ }
482+ else throw("Strict value is not equal to itself.")
483+ }
484+ else throw("Strict value is not equal to itself.")
485+ }
486+ else throw("Strict value is not equal to itself.")
487+ }
488+ }
489+
490+
491+
492+@Callable(aQ)
493+func view_canExecuteOrder (K) = {
494+ let ap = invoke(this, "executeOrder", [K], nil)
495+ if ((ap == ap))
496+ then throw("Success")
497+ else throw("Strict value is not equal to itself.")
498+ }
499+
500+
501+@Verifier(by)
502+func bz () = sigVerify(by.bodyBytes, by.proofs[0], U())
165503

github/deemru/w8io/03bedc9 
83.03 ms