tx · 2wQL7mPTEmK7eMynTFHPQoaeem9RbnDhzUtaknZVU7JA

3PPPpppPdJqaKjC6HBdrXadTeVYBipz6kAE:  -0.01400000 Waves

2019.10.11 00:16 [1744509] smart account 3PPPpppPdJqaKjC6HBdrXadTeVYBipz6kAE > SELF 0.00000000 Waves

{ "type": 13, "id": "2wQL7mPTEmK7eMynTFHPQoaeem9RbnDhzUtaknZVU7JA", "fee": 1400000, "feeAssetId": null, "timestamp": 1570742298516, "version": 1, "sender": "3PPPpppPdJqaKjC6HBdrXadTeVYBipz6kAE", "senderPublicKey": "7WHNSvrBxV3qc9gettXmhmgmQBqE2opoyiabPQnfALpp", "proofs": [ "42a52hr6Xh88YyAk6J3djpB1zWCxMZYearCGXx9iU4LNnYoyGpDcEXD97mGskLijwzmCbwQG4EHgjmCgdK1j6QLF" ], "script": "base64:AAIDAAAAAAAAADEIARIDCgEIEgASABIGCgQIAQQIEgYKBAgBBAgSBAoCCAgSBAoCCAgSAwoBCBIDCgEIAAAAAgAAAAAIdVRva2VuSWQBAAAAIOMl8koni7tlyG2EdRmesBRs1G2qGC0NAyHKwEURx8OVAQAAAAtjaGVja1N0YXR1cwAAAAEAAAAHYWRkcmVzcwQAAAAPc3RhdHVzVW5saW1pdGVkBAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAHYWRkcmVzcwIAAAAKX3VubGltaXRlZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAAEYm9vbAUAAAAHJG1hdGNoMAUAAAAEYm9vbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAcJAQAAAAV0aHJvdwAAAAAEAAAACnN0YXR1c1RpbWUEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAdhZGRyZXNzAgAAAAVfdGltZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAAAAAAAAAAAAAkBAAAABXRocm93AAAAAAMFAAAAD3N0YXR1c1VubGltaXRlZAYJAABmAAAAAgUAAAAKc3RhdHVzVGltZQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAAJAAAAAWkBAAAACGFkZEFzc2V0AAAAAQAAAAdhc3NldElkBAAAAAthZGRpbmdQcmljZQkAAGgAAAACAAAAAAAAAABkAAAAAAAF9eEABAAAAA5hZGRpbmdQcmljZVN0cgIAAAADMTAwBAAAAAdwYXltZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAFpAAAAB3BheW1lbnQCAAAAEVdoZXJlIGlzIHBheW1lbnQ/AwMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAAh1VG9rZW5JZAcJAAACAAAAAQIAAAAST1RDdSBvciBXQVZFUyBvbmx5AwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAthZGRpbmdQcmljZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAQWW91IGhhdmUgdG8gcGF5IAUAAAAOYWRkaW5nUHJpY2VTdHICAAAADiBPVEN1IG9yIFdBVkVTAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+wAAAABCQACWQAAAAEFAAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAjVGhlcmUgaXMgbm8gYXNzZXQgd2l0aCBzcGVjaWZpZWQgaWQEAAAABmFzc2V0cwQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzAgAAAAZhc3NldHMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAADc3RyBQAAAAckbWF0Y2gwBQAAAANzdHIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQCAAAAAAkBAAAABXRocm93AAAAAAMJAQAAAAlpc0RlZmluZWQAAAABCQAEswAAAAIFAAAABmFzc2V0cwUAAAAHYXNzZXRJZAkAAAIAAAABAgAAABpBc3NldCBpcyBhbHJlYWR5IGF2YWlsYWJsZQQAAAAFbGlzdDAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAABmFzc2V0cwkAASwAAAACCQABLAAAAAIFAAAABmFzc2V0cwUAAAAHYXNzZXRJZAIAAAABLAUAAAADbmlsBAAAAAVsaXN0MQMJAAAAAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAAIdVRva2VuSWQEAAAAB3Jlc2VydmUEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwIAAAAHcmVzZXJ2ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAAAAAAAAAAAAAkBAAAABXRocm93AAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAHcmVzZXJ2ZQkAAGQAAAACBQAAAAdyZXNlcnZlCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAABWxpc3QwBQAAAAVsaXN0MAkBAAAACFdyaXRlU2V0AAAAAQUAAAAFbGlzdDEAAAABaQEAAAADcHJvAAAAAAQAAAAHYWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAA51bmxpbWl0ZWRQcmljZQkAAGgAAAACAAAAAAAAAAAyAAAAAAAF9eEABAAAABF1bmxpbWl0ZWRQcmljZVN0cgIAAAACNTAEAAAACm1vbnRoUHJpY2UJAABoAAAAAgAAAAAAAAAACgAAAAAABfXhAAQAAAANbW9udGhQcmljZVN0cgIAAAACMTAEAAAAB3BheW1lbnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAggFAAAAAWkAAAAHcGF5bWVudAIAAAARV2hlcmUgaXMgcGF5bWVudD8DAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAACHVUb2tlbklkBwkAAAIAAAABAgAAABJPVEN1IG9yIFdBVkVTIG9ubHkDAwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAA51bmxpbWl0ZWRQcmljZQkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAptb250aFByaWNlBwkAAAIAAAABAgAAAA9JbnZhbGlkIHBheW1lbnQEAAAACXVubGltaXRlZAkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAADnVubGltaXRlZFByaWNlBAAAABBjdXJyZW50VW5saW1pdGVkBAAAAAckbWF0Y2gwCQAEGwAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAHYWRkcmVzcwIAAAAKX3VubGltaXRlZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAAEYm9vbAUAAAAHJG1hdGNoMAUAAAAEYm9vbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAcJAQAAAAV0aHJvdwAAAAAEAAAAC2N1cnJlbnRUaW1lBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAHYWRkcmVzcwIAAAAFX3RpbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQEAAAAFdGhyb3cAAAAAAwUAAAAQY3VycmVudFVubGltaXRlZAkAAAIAAAABAgAAADhZb3UgaGF2ZSB1bmxpbWl0ZWQgUFJPIHN0YXR1cyBhbHJlYWR5LiBXaGF0IGRvIHlvdSB3YW50PwQAAAAFbW9udGgAAAAAAJy+sZgEAAAABWxpc3QwCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAB2FkZHJlc3MCAAAACl91bmxpbWl0ZWQFAAAACXVubGltaXRlZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAdhZGRyZXNzAgAAAAVfdGltZQMFAAAACXVubGltaXRlZAAAAAAAAAAAAAkAAGQAAAACBQAAAAtjdXJyZW50VGltZQUAAAAFbW9udGgFAAAAA25pbAQAAAAFbGlzdDEDCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAACHVUb2tlbklkBAAAAAdyZXNlcnZlBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMCAAAAB3Jlc2VydmUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQAAAAAAAAAAAAJAQAAAAV0aHJvdwAAAAAJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAAB3Jlc2VydmUJAABkAAAAAgUAAAAHcmVzZXJ2ZQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAVsaXN0MAUAAAAFbGlzdDAJAQAAAAhXcml0ZVNldAAAAAEFAAAABWxpc3QxAAAAAWkBAAAAD2J1eVV0aWxpdHlUb2tlbgAAAAAEAAAAB3BheW1lbnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAggFAAAAAWkAAAAHcGF5bWVudAIAAAARV2hlcmUgaXMgcGF5bWVudD8DCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAAAIAAAABAgAAAApXQVZFUyBvbmx5BAAAAAdyZXNlcnZlBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMCAAAAB3Jlc2VydmUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQAAAAAAAAAAAAJAQAAAAV0aHJvdwAAAAADCQAAZgAAAAIIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAHcmVzZXJ2ZQkAAAIAAAABAgAAABlOb3QgZW5vdWd0aCBhc3NldCBpbiBkQXBwCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAHcmVzZXJ2ZQkAAGUAAAACBQAAAAdyZXNlcnZlCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIIBQAAAAdwYXltZW50AAAABmFtb3VudAUAAAAIdVRva2VuSWQFAAAAA25pbAAAAAFpAQAAAAhtYWtlU2VsbAAAAAQAAAAKcHJpY2VBc3NldAAAABBwcmljZUFzc2V0QW1vdW50AAAAA2FsbAAAAAhwYXNzd29yZAMDCQEAAAACIT0AAAACBQAAAApwcmljZUFzc2V0AgAAAAVXQVZFUwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+wAAAABCQACWQAAAAEFAAAACnByaWNlQXNzZXQHCQAAAgAAAAECAAAAI1RoZXJlIGlzIG5vIGFzc2V0IHdpdGggc3BlY2lmaWVkIGlkAwkAAGcAAAACAAAAAAAAAAAABQAAABBwcmljZUFzc2V0QW1vdW50CQAAAgAAAAECAAAAJkFtb3VudCBvZiBwcmljZSBhc3NldCBtdXN0IGJlIHBvc2l0aXZlBAAAAAdwYXltZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAFpAAAAB3BheW1lbnQCAAAAEVdoZXJlIGlzIHBheW1lbnQ/AwkAAGcAAAACAAAAAAAAAAAACAUAAAAHcGF5bWVudAAAAAZhbW91bnQJAAACAAAAAQIAAAAXQW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAAC2Ftb3VudEFzc2V0BAAAAAckbWF0Y2gwCAUAAAAHcGF5bWVudAAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAFwBQAAAAckbWF0Y2gwCQACWAAAAAEFAAAAAXACAAAABVdBVkVTBAAAAAZhc3NldHMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzAgAAAAZhc3NldHMCAAAAHlRoZXJlIGFyZSBub3QgYXZhaWxhYmxlIGFzc2V0cwMDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEswAAAAIFAAAABmFzc2V0cwUAAAAKcHJpY2VBc3NldAYJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAASzAAAAAgUAAAAGYXNzZXRzBQAAAAthbW91bnRBc3NldAkAAAIAAAABAgAAACNBc3NldCBhcmUgbm90IGF2YWlsYWJsZSBmb3IgdHJhZGluZwQAAAAHYWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzAwMJAQAAAAEhAAAAAQkBAAAAC2NoZWNrU3RhdHVzAAAAAQUAAAAHYWRkcmVzcwMFAAAAA2FsbAYJAQAAAAIhPQAAAAIFAAAACHBhc3N3b3JkAgAAAAAHCQAAAgAAAAECAAAALllvdSBtdXN0IGhhdmUgcHJvIHN0YXR1cyB0byB1c2UgdGhlc2UgZmVhdHVyZXMEAAAAB29yZGVySWQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAQAAAAGb3JkZXJzBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMCAAAABm9yZGVycwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0AgAAAAAJAQAAAAV0aHJvdwAAAAAEAAAADXBhc3N3b3JkVmFsaWQJAAJZAAAAAQUAAAAIcGFzc3dvcmQEAAAABGRhdGEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEc2VsbAIAAAABXwkAAaQAAAABCAUAAAAHcGF5bWVudAAAAAZhbW91bnQCAAAAAV8FAAAAC2Ftb3VudEFzc2V0AgAAAAFfCQABpAAAAAEFAAAAEHByaWNlQXNzZXRBbW91bnQCAAAAAV8FAAAACnByaWNlQXNzZXQCAAAAAV8FAAAAB2FkZHJlc3MCAAAAAV8JAAGlAAAAAQUAAAADYWxsAgAAAAFfBQAAAAhwYXNzd29yZAIAAAABXwkAAaQAAAABAAAAAAAAAAAACQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAAZvcmRlcnMJAAEsAAAAAgkAASwAAAACBQAAAAZvcmRlcnMFAAAAB29yZGVySWQCAAAAASwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAB29yZGVySWQFAAAABGRhdGEFAAAAA25pbAAAAAFpAQAAAAdtYWtlQnV5AAAABAAAAAthbW91bnRBc3NldAAAAAZhbW91bnQAAAADYWxsAAAACHBhc3N3b3JkAwMJAQAAAAIhPQAAAAIFAAAAC2Ftb3VudEFzc2V0AgAAAAVXQVZFUwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+wAAAABCQACWQAAAAEFAAAAC2Ftb3VudEFzc2V0BwkAAAIAAAABAgAAACNUaGVyZSBpcyBubyBhc3NldCB3aXRoIHNwZWNpZmllZCBpZAMJAABnAAAAAgAAAAAAAAAAAAUAAAAGYW1vdW50CQAAAgAAAAECAAAAF0Ftb3VudCBtdXN0IGJlIHBvc2l0aXZlBAAAAAdwYXltZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAFpAAAAB3BheW1lbnQCAAAAEXdoZXJlIGlzIHBheW1lbnQ/BAAAABBwcmljZUFzc2V0QW1vdW50CAUAAAAHcGF5bWVudAAAAAZhbW91bnQDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEHByaWNlQXNzZXRBbW91bnQJAAACAAAAAQIAAAAXYW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAACnByaWNlQXNzZXQEAAAAByRtYXRjaDAIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAXAFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAABcAIAAAAFV0FWRVMEAAAABmFzc2V0cwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMCAAAABmFzc2V0cwIAAAAeVGhlcmUgYXJlIG5vdCBhdmFpbGFibGUgYXNzZXRzAwMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAASzAAAAAgUAAAAGYXNzZXRzBQAAAApwcmljZUFzc2V0BgkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABLMAAAACBQAAAAZhc3NldHMFAAAAC2Ftb3VudEFzc2V0CQAAAgAAAAECAAAAI0Fzc2V0IGFyZSBub3QgYXZhaWxhYmxlIGZvciB0cmFkaW5nBAAAAAdhZGRyZXNzCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMDAwkBAAAAASEAAAABCQEAAAALY2hlY2tTdGF0dXMAAAABBQAAAAdhZGRyZXNzAwUAAAADYWxsBgkBAAAAAiE9AAAAAgUAAAAIcGFzc3dvcmQCAAAAAAcJAAACAAAAAQIAAAAuWW91IG11c3QgaGF2ZSBwcm8gc3RhdHVzIHRvIHVzZSB0aGVzZSBmZWF0dXJlcwQAAAAHb3JkZXJJZAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBAAAAAZvcmRlcnMEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwIAAAAGb3JkZXJzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAFAAAAAXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQCAAAAAAkBAAAABXRocm93AAAAAAMJAAAAAAAAAgUAAAAGYW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAEmludmFsaWQgYnV5IGFtb3VudAQAAAAEZGF0YQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAANidXkCAAAAAV8JAAGkAAAAAQUAAAAGYW1vdW50AgAAAAFfBQAAAAthbW91bnRBc3NldAIAAAABXwkAAaQAAAABBQAAABBwcmljZUFzc2V0QW1vdW50AgAAAAFfBQAAAApwcmljZUFzc2V0AgAAAAFfBQAAAAdhZGRyZXNzAgAAAAFfCQABpQAAAAEFAAAAA2FsbAIAAAABXwUAAAAIcGFzc3dvcmQCAAAAAV8JAAGkAAAAAQAAAAAAAAAAAAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAGb3JkZXJzCQABLAAAAAIJAAEsAAAAAgUAAAAGb3JkZXJzBQAAAAdvcmRlcklkAgAAAAEsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAdvcmRlcklkBQAAAARkYXRhBQAAAANuaWwAAAABaQEAAAAIdGFrZVNlbGwAAAACAAAAB29yZGVySWQAAAADc2lnBAAAAAdwYXltZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAFpAAAAB3BheW1lbnQCAAAAEVdoZXJlIGlzIHBheW1lbnQ/BAAAABBwcmljZUFzc2V0QW1vdW50CAUAAAAHcGF5bWVudAAAAAZhbW91bnQDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEHByaWNlQXNzZXRBbW91bnQJAAACAAAAAQIAAAAXQW1vdW50IG11c3QgYmUgcG9zaXRpdmUEAAAACnByaWNlQXNzZXQEAAAAByRtYXRjaDAIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAXAFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAABcAIAAAAFV0FWRVMEAAAABGRhdGEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAdvcmRlcklkAgAAABBJbnZhbGlkIG9yZGVyIGlkBAAAAAVwYXJ0cwkABLUAAAACBQAAAARkYXRhAgAAAAFfBAAAAAlvcmRlclR5cGUJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAAEAAAAC29yZGVyQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAEEAAAAEG9yZGVyQW1vdW50QXNzZXQJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAIEAAAAFW9yZGVyUHJpY2VBc3NldEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAADBAAAAA9vcmRlclByaWNlQXNzZXQJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAQEAAAACm9yZGVyT3duZXIJAQAAAAV2YWx1ZQAAAAEJAQAAABFhZGRyZXNzRnJvbVN0cmluZwAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAUEAAAACG9yZGVyQWxsAwkAAAAAAAACCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAAGAgAAAAR0cnVlBgcEAAAADW9yZGVyUGFzc3dvcmQJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAcEAAAACm9yZGVyU3BlbnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAACAMJAQAAAAIhPQAAAAIFAAAACW9yZGVyVHlwZQIAAAAEc2VsbAkAAAIAAAABAgAAABJJbnZhbGlkIG9yZGVyIHR5cGUDCQEAAAACIT0AAAACBQAAAA9vcmRlclByaWNlQXNzZXQFAAAACnByaWNlQXNzZXQJAAACAAAAAQkAASwAAAACAgAAABZQYXltZW50IGFzc2V0IG11c3QgYmUgBQAAAA9vcmRlclByaWNlQXNzZXQEAAAABXZhbGlkAwkBAAAAAiE9AAAAAgUAAAANb3JkZXJQYXNzd29yZAIAAAAACQAB9AAAAAMIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAlkAAAABBQAAAANzaWcJAAJZAAAAAQUAAAANb3JkZXJQYXNzd29yZAYDCQEAAAABIQAAAAEFAAAABXZhbGlkCQAAAgAAAAECAAAAFFRoZSBvcmRlciBpcyBwcml2YXRlBAAAAAZhbW91bnQJAABpAAAAAgkAAGgAAAACBQAAABBwcmljZUFzc2V0QW1vdW50BQAAAAtvcmRlckFtb3VudAUAAAAVb3JkZXJQcmljZUFzc2V0QW1vdW50AwkAAAAAAAACBQAAAAZhbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAOSW52YWxpZCBhbW91bnQDAwUAAAAIb3JkZXJBbGwJAABmAAAAAgUAAAALb3JkZXJBbW91bnQFAAAABmFtb3VudAcJAAACAAAAAQIAAAAZWW91IG11c3QgdGFrZSBhbGwgb3Igbm9uZQMJAABmAAAAAgUAAAAGYW1vdW50CQAAZQAAAAIFAAAAC29yZGVyQW1vdW50BQAAAApvcmRlclNwZW50CQAAAgAAAAECAAAAGk5vdCBlbm91Z3RoIGFzc2V0IGluIG9yZGVyBAAAAAZvcmRlcnMEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwIAAAAGb3JkZXJzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAFAAAAAXMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQCAAAAAAkBAAAABXRocm93AAAAAAQAAAAHbmV3RGF0YQkAASwAAAACCQEAAAAJZHJvcFJpZ2h0AAAAAgUAAAAEZGF0YQkAATEAAAABCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAAICQABpAAAAAEJAABkAAAAAgUAAAAKb3JkZXJTcGVudAUAAAAGYW1vdW50BAAAAAVpbmRleAkBAAAABXZhbHVlAAAAAQkABLMAAAACBQAAAAZvcmRlcnMFAAAAB29yZGVySWQEAAAACW5ld09yZGVycwMJAAAAAAAAAgUAAAALb3JkZXJBbW91bnQJAABkAAAAAgUAAAAGYW1vdW50BQAAAApvcmRlclNwZW50CQABLAAAAAIJAAEvAAAAAgUAAAAGb3JkZXJzBQAAAAVpbmRleAkAATAAAAACBQAAAAZvcmRlcnMJAABkAAAAAgkAAGQAAAACBQAAAAVpbmRleAkAATEAAAABBQAAAAdvcmRlcklkAAAAAAAAAAABBQAAAAZvcmRlcnMEAAAACHRvQ2FsbGVyCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAABmFtb3VudAMJAAAAAAAAAgUAAAAQb3JkZXJBbW91bnRBc3NldAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAQb3JkZXJBbW91bnRBc3NldAQAAAAHdG9Pd25lcgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAKb3JkZXJPd25lcgUAAAAQcHJpY2VBc3NldEFtb3VudAMJAAAAAAAAAgUAAAAPb3JkZXJQcmljZUFzc2V0AgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAA9vcmRlclByaWNlQXNzZXQJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAAZvcmRlcnMFAAAACW5ld09yZGVycwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHb3JkZXJJZAUAAAAHbmV3RGF0YQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIFAAAACHRvQ2FsbGVyCQAETAAAAAIFAAAAB3RvT3duZXIFAAAAA25pbAAAAAFpAQAAAAd0YWtlQnV5AAAAAgAAAAdvcmRlcklkAAAAA3NpZwQAAAAHcGF5bWVudAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCAUAAAABaQAAAAdwYXltZW50AgAAABF3aGVyZSBpcyBwYXltZW50PwQAAAAGYW1vdW50CAUAAAAHcGF5bWVudAAAAAZhbW91bnQDCQAAZwAAAAIAAAAAAAAAAAAFAAAABmFtb3VudAkAAAIAAAABAgAAABdhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQQAAAALYW1vdW50QXNzZXQEAAAAByRtYXRjaDAIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAXAFAAAAByRtYXRjaDAJAAJYAAAAAQUAAAABcAIAAAAFV0FWRVMEAAAABGRhdGEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAdvcmRlcklkAgAAABBJbnZhbGlkIG9yZGVyIGlkBAAAAAVwYXJ0cwkABLUAAAACBQAAAARkYXRhAgAAAAFfBAAAAAlvcmRlclR5cGUJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAAEAAAAC29yZGVyQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAEEAAAAEG9yZGVyQW1vdW50QXNzZXQJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAIEAAAAFW9yZGVyUHJpY2VBc3NldEFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAADBAAAAA9vcmRlclByaWNlQXNzZXQJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAQEAAAACm9yZGVyT3duZXIJAQAAAAV2YWx1ZQAAAAEJAQAAABFhZGRyZXNzRnJvbVN0cmluZwAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAUEAAAACG9yZGVyQWxsAwkAAAAAAAACCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAAGAgAAAAR0cnVlBgcEAAAADW9yZGVyUGFzc3dvcmQJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAcEAAAACm9yZGVyU3BlbnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAACAMJAQAAAAIhPQAAAAIFAAAACW9yZGVyVHlwZQIAAAADYnV5CQAAAgAAAAECAAAAEkludmFsaWQgb3JkZXIgdHlwZQMJAQAAAAIhPQAAAAIFAAAAEG9yZGVyQW1vdW50QXNzZXQFAAAAC2Ftb3VudEFzc2V0CQAAAgAAAAEJAAEsAAAAAgIAAAAWcGF5bWVudCBhc3NldCBtdXN0IGJlIAUAAAAQb3JkZXJBbW91bnRBc3NldAQAAAAFdmFsaWQDCQEAAAACIT0AAAACBQAAAA1vcmRlclBhc3N3b3JkAgAAAAAJAAH0AAAAAwgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQACWQAAAAEFAAAAA3NpZwkAAlkAAAABBQAAAA1vcmRlclBhc3N3b3JkBgMJAQAAAAEhAAAAAQUAAAAFdmFsaWQJAAACAAAAAQIAAAAUVGhlIG9yZGVyIGlzIHByaXZhdGUEAAAAEHByaWNlQXNzZXRBbW91bnQJAABpAAAAAgkAAGgAAAACBQAAAAZhbW91bnQFAAAAFW9yZGVyUHJpY2VBc3NldEFtb3VudAUAAAALb3JkZXJBbW91bnQDCQAAAAAAAAIFAAAAEHByaWNlQXNzZXRBbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAOSW52YWxpZCBhbW91bnQDAwUAAAAIb3JkZXJBbGwJAABmAAAAAgUAAAAVb3JkZXJQcmljZUFzc2V0QW1vdW50BQAAABBwcmljZUFzc2V0QW1vdW50BwkAAAIAAAABAgAAABlZb3UgbXVzdCB0YWtlIGFsbCBvciBub25lAwkAAGYAAAACBQAAABBwcmljZUFzc2V0QW1vdW50CQAAZQAAAAIFAAAAFW9yZGVyUHJpY2VBc3NldEFtb3VudAUAAAAKb3JkZXJTcGVudAkAAAIAAAABAgAAABpub3QgZW5vdWd0aCBhc3NldCBpbiBvcmRlcgQAAAAGb3JkZXJzBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMCAAAABm9yZGVycwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0AgAAAAAJAQAAAAV0aHJvdwAAAAAEAAAAB25ld0RhdGEJAAEsAAAAAgkBAAAACWRyb3BSaWdodAAAAAIFAAAABGRhdGEJAAExAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAACAkAAaQAAAABCQAAZAAAAAIFAAAACm9yZGVyU3BlbnQFAAAAEHByaWNlQXNzZXRBbW91bnQEAAAABWluZGV4CQEAAAAFdmFsdWUAAAABCQAEswAAAAIFAAAABm9yZGVycwUAAAAHb3JkZXJJZAQAAAAJbmV3T3JkZXJzAwkAAAAAAAACBQAAABVvcmRlclByaWNlQXNzZXRBbW91bnQJAABkAAAAAgUAAAAQcHJpY2VBc3NldEFtb3VudAUAAAAKb3JkZXJTcGVudAkAASwAAAACCQABLwAAAAIFAAAABm9yZGVycwUAAAAFaW5kZXgJAAEwAAAAAgUAAAAGb3JkZXJzCQAAZAAAAAIJAABkAAAAAgUAAAAFaW5kZXgJAAExAAAAAQUAAAAHb3JkZXJJZAAAAAAAAAAAAQUAAAAGb3JkZXJzBAAAAAh0b0NhbGxlcgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABBwcmljZUFzc2V0QW1vdW50AwkAAAAAAAACBQAAAA9vcmRlclByaWNlQXNzZXQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAAD29yZGVyUHJpY2VBc3NldAQAAAAHdG9Pd25lcgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAKb3JkZXJPd25lcgUAAAAGYW1vdW50AwkAAAAAAAACBQAAABBvcmRlckFtb3VudEFzc2V0AgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAABBvcmRlckFtb3VudEFzc2V0CQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAGb3JkZXJzBQAAAAluZXdPcmRlcnMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAB29yZGVySWQFAAAAB25ld0RhdGEFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACBQAAAAh0b0NhbGxlcgkABEwAAAACBQAAAAd0b093bmVyBQAAAANuaWwAAAABaQEAAAAKcmV0dXJuU2VsbAAAAAEAAAAHb3JkZXJJZAQAAAAEZGF0YQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAB29yZGVySWQCAAAAEEludmFsaWQgb3JkZXIgaWQEAAAABXBhcnRzCQAEtQAAAAIFAAAABGRhdGECAAAAAV8EAAAACW9yZGVyVHlwZQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAAQAAAALb3JkZXJBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAQQAAAAQb3JkZXJBbW91bnRBc3NldAkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAgQAAAAVb3JkZXJQcmljZUFzc2V0QW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAMEAAAAD29yZGVyUHJpY2VBc3NldAkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAABAQAAAAKb3JkZXJPd25lcgkBAAAABXZhbHVlAAAAAQkBAAAAEWFkZHJlc3NGcm9tU3RyaW5nAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAABQQAAAAIb3JkZXJBbGwDCQAAAAAAAAIJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAYCAAAABHRydWUGBwQAAAANb3JkZXJQYXNzd29yZAkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAABwQAAAAKb3JkZXJTcGVudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAAIAwkBAAAAAiE9AAAAAgUAAAAJb3JkZXJUeXBlAgAAAARzZWxsCQAAAgAAAAECAAAAEkludmFsaWQgb3JkZXIgdHlwZQMJAQAAAAIhPQAAAAIFAAAACm9yZGVyT3duZXIIBQAAAAFpAAAABmNhbGxlcgkAAAIAAAABAgAAACZyZXR1cm4gc2hvdWxkIGJlIGNhbGxlZCBieSBvcmRlciBvd25lcgQAAAAMcmV0dXJuQW1vdW50CQAAZQAAAAIFAAAAC29yZGVyQW1vdW50BQAAAApvcmRlclNwZW50AwkAAGcAAAACAAAAAAAAAAAABQAAAAxyZXR1cm5BbW91bnQJAAACAAAAAQIAAAARbm90aGluZyB0byByZXR1cm4EAAAABm9yZGVycwQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzAgAAAAZvcmRlcnMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAIAAAAACQEAAAAFdGhyb3cAAAAABAAAAAduZXdEYXRhCQABLAAAAAIJAQAAAAlkcm9wUmlnaHQAAAACBQAAAARkYXRhCQABMQAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAgJAAGkAAAAAQUAAAALb3JkZXJBbW91bnQEAAAABWluZGV4CQEAAAAFdmFsdWUAAAABCQAEswAAAAIFAAAABm9yZGVycwUAAAAHb3JkZXJJZAQAAAAJbmV3T3JkZXJzCQABLAAAAAIJAAEvAAAAAgUAAAAGb3JkZXJzBQAAAAVpbmRleAkAATAAAAACBQAAAAZvcmRlcnMJAABkAAAAAgkAAGQAAAACBQAAAAVpbmRleAkAATEAAAABBQAAAAdvcmRlcklkAAAAAAAAAAABCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAGb3JkZXJzBQAAAAluZXdPcmRlcnMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAB29yZGVySWQFAAAAB25ld0RhdGEFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADHJldHVybkFtb3VudAMJAAAAAAAAAgUAAAAQb3JkZXJBbW91bnRBc3NldAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAQb3JkZXJBbW91bnRBc3NldAUAAAADbmlsAAAAAWkBAAAACXJldHVybkJ1eQAAAAEAAAAHb3JkZXJJZAQAAAAEZGF0YQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAB29yZGVySWQCAAAAEEludmFsaWQgb3JkZXIgaWQEAAAABXBhcnRzCQAEtQAAAAIFAAAABGRhdGECAAAAAV8EAAAACW9yZGVyVHlwZQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAAQAAAALb3JkZXJBbW91bnQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAQQAAAAQb3JkZXJBbW91bnRBc3NldAkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAgQAAAAVb3JkZXJQcmljZUFzc2V0QW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAMEAAAAD29yZGVyUHJpY2VBc3NldAkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAABAQAAAAKb3JkZXJPd25lcgkBAAAABXZhbHVlAAAAAQkBAAAAEWFkZHJlc3NGcm9tU3RyaW5nAAAAAQkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAABQQAAAAIb3JkZXJBbGwDCQAAAAAAAAIJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAYCAAAABHRydWUGBwQAAAANb3JkZXJQYXNzd29yZAkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAABwQAAAAKb3JkZXJTcGVudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAAIAwkBAAAAAiE9AAAAAgUAAAAJb3JkZXJUeXBlAgAAAANidXkJAAACAAAAAQIAAAASSW52YWxpZCBvcmRlciB0eXBlAwkBAAAAAiE9AAAAAgUAAAAKb3JkZXJPd25lcggFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAJlJldHVybiBzaG91bGQgYmUgY2FsbGVkIGJ5IG9yZGVyIG93bmVyBAAAAAxyZXR1cm5BbW91bnQJAABlAAAAAgUAAAAVb3JkZXJQcmljZUFzc2V0QW1vdW50BQAAAApvcmRlclNwZW50AwkAAGcAAAACAAAAAAAAAAAABQAAAAxyZXR1cm5BbW91bnQJAAACAAAAAQIAAAARbm90aGluZyB0byByZXR1cm4EAAAABm9yZGVycwQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzAgAAAAZvcmRlcnMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAIAAAAACQEAAAAFdGhyb3cAAAAABAAAAAduZXdEYXRhCQABLAAAAAIJAQAAAAlkcm9wUmlnaHQAAAACBQAAAARkYXRhCQABMQAAAAEJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAgJAAGkAAAAAQUAAAAVb3JkZXJQcmljZUFzc2V0QW1vdW50BAAAAAVpbmRleAkBAAAABXZhbHVlAAAAAQkABLMAAAACBQAAAAZvcmRlcnMFAAAAB29yZGVySWQEAAAACW5ld09yZGVycwkAASwAAAACCQABLwAAAAIFAAAABm9yZGVycwUAAAAFaW5kZXgJAAEwAAAAAgUAAAAGb3JkZXJzCQAAZAAAAAIJAABkAAAAAgUAAAAFaW5kZXgJAAExAAAAAQUAAAAHb3JkZXJJZAAAAAAAAAAAAQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAABm9yZGVycwUAAAAJbmV3T3JkZXJzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAdvcmRlcklkBQAAAAduZXdEYXRhBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxyZXR1cm5BbW91bnQDCQAAAAAAAAIFAAAAD29yZGVyUHJpY2VBc3NldAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAPb3JkZXJQcmljZUFzc2V0BQAAAANuaWwAAAAAWxwJnw==", "chainId": 87, "height": 1744509, "spentComplexity": 0 } View: original | compacted Prev: EtWeT19gqEvd1EzfAoRwuD9KiStn4T3WCQwiCXVASoTD Next: Djqam2ZuyxEwPNr3Z944n2fp1VSSrzk4hCwbMFVY1HrS Diff:
OldNewDifferences
5050 }
5151 if (isDefined(indexOf(assets, assetId)))
5252 then throw("Asset is already available")
53- else WriteSet([DataEntry("assets", ((assets + assetId) + ","))])
53+ else {
54+ let list0 = [DataEntry("assets", ((assets + assetId) + ","))]
55+ let list1 = if ((payment.assetId == uTokenId))
56+ then {
57+ let reserve = match getInteger(this, "reserve") {
58+ case int: Int =>
59+ int
60+ case _: Unit =>
61+ 0
62+ case _ =>
63+ throw()
64+ }
65+DataEntry("reserve", (reserve + payment.amount)) :: list0
66+ }
67+ else list0
68+ WriteSet(list1)
69+ }
5470 }
5571 }
5672
5773
5874
5975 @Callable(i)
60-func pro (unlimited) = {
76+func pro () = {
6177 let address = toBase58String(i.caller.bytes)
6278 let unlimitedPrice = (50 * 100000000)
6379 let unlimitedPriceStr = "50"
6884 then (payment.assetId != uTokenId)
6985 else false)
7086 then throw("OTCu or WAVES only")
71- else if (if (unlimited)
72- then (payment.amount != unlimitedPrice)
87+ else if (if ((payment.amount != unlimitedPrice))
88+ then (payment.amount != monthPrice)
7389 else false)
74- then throw((("You have to pay " + unlimitedPriceStr) + " OTCu or WAVES"))
75- else if (if (!(unlimited))
76- then (payment.amount != monthPrice)
77- else false)
78- then throw((("You have to pay " + monthPriceStr) + " OTCu or WAVES"))
79- else {
80- let currentUnlimited = match getBoolean(this, (address + "_unlimited")) {
81- case bool: Boolean =>
82- bool
83- case _: Unit =>
84- false
85- case _ =>
86- throw()
87- }
88- let currentTime = match getInteger(this, (address + "_time")) {
89- case int: Int =>
90- int
91- case _: Unit =>
92- lastBlock.timestamp
93- case _ =>
94- throw()
95- }
96- if (currentUnlimited)
97- then throw("You have unlimited PRO status already. What do you want?")
98- else {
99- let month = 2629743000
100- WriteSet([DataEntry((address + "_unlimited"), unlimited), DataEntry((address + "_time"), if (unlimited)
101- then 0
102- else (currentTime + month))])
103- }
104- }
90+ then throw("Invalid payment")
91+ else {
92+ let unlimited = (payment.amount == unlimitedPrice)
93+ let currentUnlimited = match getBoolean(this, (address + "_unlimited")) {
94+ case bool: Boolean =>
95+ bool
96+ case _: Unit =>
97+ false
98+ case _ =>
99+ throw()
100+ }
101+ let currentTime = match getInteger(this, (address + "_time")) {
102+ case int: Int =>
103+ int
104+ case _: Unit =>
105+ lastBlock.timestamp
106+ case _ =>
107+ throw()
108+ }
109+ if (currentUnlimited)
110+ then throw("You have unlimited PRO status already. What do you want?")
111+ else {
112+ let month = 2629743000
113+ let list0 = [DataEntry((address + "_unlimited"), unlimited), DataEntry((address + "_time"), if (unlimited)
114+ then 0
115+ else (currentTime + month))]
116+ let list1 = if ((payment.assetId == uTokenId))
117+ then {
118+ let reserve = match getInteger(this, "reserve") {
119+ case int: Int =>
120+ int
121+ case _: Unit =>
122+ 0
123+ case _ =>
124+ throw()
125+ }
126+DataEntry("reserve", (reserve + payment.amount)) :: list0
127+ }
128+ else list0
129+ WriteSet(list1)
130+ }
131+ }
105132 }
106133
107134
111138 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
112139 if (isDefined(payment.assetId))
113140 then throw("WAVES only")
114- else TransferSet([ScriptTransfer(i.caller, payment.amount, uTokenId)])
141+ else {
142+ let reserve = match getInteger(this, "reserve") {
143+ case int: Int =>
144+ int
145+ case _: Unit =>
146+ 0
147+ case _ =>
148+ throw()
149+ }
150+ if ((payment.amount > reserve))
151+ then throw("Not enougth asset in dApp")
152+ else ScriptResult(WriteSet([DataEntry("reserve", (reserve - payment.amount))]), TransferSet([ScriptTransfer(i.caller, payment.amount, uTokenId)]))
153+ }
115154 }
116155
117156
282321 let newOrders = if ((orderAmount == (amount + orderSpent)))
283322 then (take(orders, index) + drop(orders, ((index + size(orderId)) + 1)))
284323 else orders
285- ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(i.caller, amount, if ((orderAmountAsset == "WAVES"))
324+ let toCaller = ScriptTransfer(i.caller, amount, if ((orderAmountAsset == "WAVES"))
286325 then unit
287- else fromBase58String(orderAmountAsset)), ScriptTransfer(orderOwner, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
326+ else fromBase58String(orderAmountAsset))
327+ let toOwner = ScriptTransfer(orderOwner, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
288328 then unit
289- else fromBase58String(orderPriceAsset))]))
329+ else fromBase58String(orderPriceAsset))
330+ ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([toCaller, toOwner]))
290331 }
291332 }
292333 }
355396 let newOrders = if ((orderPriceAssetAmount == (priceAssetAmount + orderSpent)))
356397 then (take(orders, index) + drop(orders, ((index + size(orderId)) + 1)))
357398 else orders
358- ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(i.caller, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
399+ let toCaller = ScriptTransfer(i.caller, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
359400 then unit
360- else fromBase58String(orderPriceAsset)), ScriptTransfer(orderOwner, amount, if ((orderAmountAsset == "WAVES"))
401+ else fromBase58String(orderPriceAsset))
402+ let toOwner = ScriptTransfer(orderOwner, amount, if ((orderAmountAsset == "WAVES"))
361403 then unit
362- else fromBase58String(orderAmountAsset))]))
404+ else fromBase58String(orderAmountAsset))
405+ ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([toCaller, toOwner]))
363406 }
364407 }
365408 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let uTokenId = base58'GHh7EMnVnUBCYNJMktuLPVr3P2oCqBCb4c87fBCZ5CzY'
55
66 func checkStatus (address) = {
77 let statusUnlimited = match getBoolean(this, (address + "_unlimited")) {
88 case bool: Boolean =>
99 bool
1010 case _: Unit =>
1111 false
1212 case _ =>
1313 throw()
1414 }
1515 let statusTime = match getInteger(this, (address + "_time")) {
1616 case int: Int =>
1717 int
1818 case _: Unit =>
1919 0
2020 case _ =>
2121 throw()
2222 }
2323 if (statusUnlimited)
2424 then true
2525 else (statusTime > lastBlock.timestamp)
2626 }
2727
2828
2929 @Callable(i)
3030 func addAsset (assetId) = {
3131 let addingPrice = (100 * 100000000)
3232 let addingPriceStr = "100"
3333 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
3434 if (if (isDefined(payment.assetId))
3535 then (payment.assetId != uTokenId)
3636 else false)
3737 then throw("OTCu or WAVES only")
3838 else if ((payment.amount != addingPrice))
3939 then throw((("You have to pay " + addingPriceStr) + " OTCu or WAVES"))
4040 else if (!(isDefined(assetInfo(fromBase58String(assetId)))))
4141 then throw("There is no asset with specified id")
4242 else {
4343 let assets = match getString(this, "assets") {
4444 case str: String =>
4545 str
4646 case _: Unit =>
4747 ""
4848 case _ =>
4949 throw()
5050 }
5151 if (isDefined(indexOf(assets, assetId)))
5252 then throw("Asset is already available")
53- else WriteSet([DataEntry("assets", ((assets + assetId) + ","))])
53+ else {
54+ let list0 = [DataEntry("assets", ((assets + assetId) + ","))]
55+ let list1 = if ((payment.assetId == uTokenId))
56+ then {
57+ let reserve = match getInteger(this, "reserve") {
58+ case int: Int =>
59+ int
60+ case _: Unit =>
61+ 0
62+ case _ =>
63+ throw()
64+ }
65+DataEntry("reserve", (reserve + payment.amount)) :: list0
66+ }
67+ else list0
68+ WriteSet(list1)
69+ }
5470 }
5571 }
5672
5773
5874
5975 @Callable(i)
60-func pro (unlimited) = {
76+func pro () = {
6177 let address = toBase58String(i.caller.bytes)
6278 let unlimitedPrice = (50 * 100000000)
6379 let unlimitedPriceStr = "50"
6480 let monthPrice = (10 * 100000000)
6581 let monthPriceStr = "10"
6682 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
6783 if (if (isDefined(payment.assetId))
6884 then (payment.assetId != uTokenId)
6985 else false)
7086 then throw("OTCu or WAVES only")
71- else if (if (unlimited)
72- then (payment.amount != unlimitedPrice)
87+ else if (if ((payment.amount != unlimitedPrice))
88+ then (payment.amount != monthPrice)
7389 else false)
74- then throw((("You have to pay " + unlimitedPriceStr) + " OTCu or WAVES"))
75- else if (if (!(unlimited))
76- then (payment.amount != monthPrice)
77- else false)
78- then throw((("You have to pay " + monthPriceStr) + " OTCu or WAVES"))
79- else {
80- let currentUnlimited = match getBoolean(this, (address + "_unlimited")) {
81- case bool: Boolean =>
82- bool
83- case _: Unit =>
84- false
85- case _ =>
86- throw()
87- }
88- let currentTime = match getInteger(this, (address + "_time")) {
89- case int: Int =>
90- int
91- case _: Unit =>
92- lastBlock.timestamp
93- case _ =>
94- throw()
95- }
96- if (currentUnlimited)
97- then throw("You have unlimited PRO status already. What do you want?")
98- else {
99- let month = 2629743000
100- WriteSet([DataEntry((address + "_unlimited"), unlimited), DataEntry((address + "_time"), if (unlimited)
101- then 0
102- else (currentTime + month))])
103- }
104- }
90+ then throw("Invalid payment")
91+ else {
92+ let unlimited = (payment.amount == unlimitedPrice)
93+ let currentUnlimited = match getBoolean(this, (address + "_unlimited")) {
94+ case bool: Boolean =>
95+ bool
96+ case _: Unit =>
97+ false
98+ case _ =>
99+ throw()
100+ }
101+ let currentTime = match getInteger(this, (address + "_time")) {
102+ case int: Int =>
103+ int
104+ case _: Unit =>
105+ lastBlock.timestamp
106+ case _ =>
107+ throw()
108+ }
109+ if (currentUnlimited)
110+ then throw("You have unlimited PRO status already. What do you want?")
111+ else {
112+ let month = 2629743000
113+ let list0 = [DataEntry((address + "_unlimited"), unlimited), DataEntry((address + "_time"), if (unlimited)
114+ then 0
115+ else (currentTime + month))]
116+ let list1 = if ((payment.assetId == uTokenId))
117+ then {
118+ let reserve = match getInteger(this, "reserve") {
119+ case int: Int =>
120+ int
121+ case _: Unit =>
122+ 0
123+ case _ =>
124+ throw()
125+ }
126+DataEntry("reserve", (reserve + payment.amount)) :: list0
127+ }
128+ else list0
129+ WriteSet(list1)
130+ }
131+ }
105132 }
106133
107134
108135
109136 @Callable(i)
110137 func buyUtilityToken () = {
111138 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
112139 if (isDefined(payment.assetId))
113140 then throw("WAVES only")
114- else TransferSet([ScriptTransfer(i.caller, payment.amount, uTokenId)])
141+ else {
142+ let reserve = match getInteger(this, "reserve") {
143+ case int: Int =>
144+ int
145+ case _: Unit =>
146+ 0
147+ case _ =>
148+ throw()
149+ }
150+ if ((payment.amount > reserve))
151+ then throw("Not enougth asset in dApp")
152+ else ScriptResult(WriteSet([DataEntry("reserve", (reserve - payment.amount))]), TransferSet([ScriptTransfer(i.caller, payment.amount, uTokenId)]))
153+ }
115154 }
116155
117156
118157
119158 @Callable(i)
120159 func makeSell (priceAsset,priceAssetAmount,all,password) = if (if ((priceAsset != "WAVES"))
121160 then !(isDefined(assetInfo(fromBase58String(priceAsset))))
122161 else false)
123162 then throw("There is no asset with specified id")
124163 else if ((0 >= priceAssetAmount))
125164 then throw("Amount of price asset must be positive")
126165 else {
127166 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
128167 if ((0 >= payment.amount))
129168 then throw("Amount must be positive")
130169 else {
131170 let amountAsset = match payment.assetId {
132171 case p: ByteVector =>
133172 toBase58String(p)
134173 case _ =>
135174 "WAVES"
136175 }
137176 let assets = valueOrErrorMessage(getString(this, "assets"), "There are not available assets")
138177 if (if (!(isDefined(indexOf(assets, priceAsset))))
139178 then true
140179 else !(isDefined(indexOf(assets, amountAsset))))
141180 then throw("Asset are not available for trading")
142181 else {
143182 let address = toBase58String(i.caller.bytes)
144183 if (if (!(checkStatus(address)))
145184 then if (all)
146185 then true
147186 else (password != "")
148187 else false)
149188 then throw("You must have pro status to use these features")
150189 else {
151190 let orderId = toBase58String(i.transactionId)
152191 let orders = match getString(this, "orders") {
153192 case s: String =>
154193 s
155194 case _: Unit =>
156195 ""
157196 case _ =>
158197 throw()
159198 }
160199 let passwordValid = fromBase58String(password)
161200 let data = (((((((((((((((("sell" + "_") + toString(payment.amount)) + "_") + amountAsset) + "_") + toString(priceAssetAmount)) + "_") + priceAsset) + "_") + address) + "_") + toString(all)) + "_") + password) + "_") + toString(0))
162201 WriteSet([DataEntry("orders", ((orders + orderId) + ",")), DataEntry(orderId, data)])
163202 }
164203 }
165204 }
166205 }
167206
168207
169208
170209 @Callable(i)
171210 func makeBuy (amountAsset,amount,all,password) = if (if ((amountAsset != "WAVES"))
172211 then !(isDefined(assetInfo(fromBase58String(amountAsset))))
173212 else false)
174213 then throw("There is no asset with specified id")
175214 else if ((0 >= amount))
176215 then throw("Amount must be positive")
177216 else {
178217 let payment = valueOrErrorMessage(i.payment, "where is payment?")
179218 let priceAssetAmount = payment.amount
180219 if ((0 >= priceAssetAmount))
181220 then throw("amount must be positive")
182221 else {
183222 let priceAsset = match payment.assetId {
184223 case p: ByteVector =>
185224 toBase58String(p)
186225 case _ =>
187226 "WAVES"
188227 }
189228 let assets = valueOrErrorMessage(getString(this, "assets"), "There are not available assets")
190229 if (if (!(isDefined(indexOf(assets, priceAsset))))
191230 then true
192231 else !(isDefined(indexOf(assets, amountAsset))))
193232 then throw("Asset are not available for trading")
194233 else {
195234 let address = toBase58String(i.caller.bytes)
196235 if (if (!(checkStatus(address)))
197236 then if (all)
198237 then true
199238 else (password != "")
200239 else false)
201240 then throw("You must have pro status to use these features")
202241 else {
203242 let orderId = toBase58String(i.transactionId)
204243 let orders = match getString(this, "orders") {
205244 case s: String =>
206245 s
207246 case _: Unit =>
208247 ""
209248 case _ =>
210249 throw()
211250 }
212251 if ((amount == 0))
213252 then throw("invalid buy amount")
214253 else {
215254 let data = (((((((((((((((("buy" + "_") + toString(amount)) + "_") + amountAsset) + "_") + toString(priceAssetAmount)) + "_") + priceAsset) + "_") + address) + "_") + toString(all)) + "_") + password) + "_") + toString(0))
216255 WriteSet([DataEntry("orders", ((orders + orderId) + ",")), DataEntry(orderId, data)])
217256 }
218257 }
219258 }
220259 }
221260 }
222261
223262
224263
225264 @Callable(i)
226265 func takeSell (orderId,sig) = {
227266 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
228267 let priceAssetAmount = payment.amount
229268 if ((0 >= priceAssetAmount))
230269 then throw("Amount must be positive")
231270 else {
232271 let priceAsset = match payment.assetId {
233272 case p: ByteVector =>
234273 toBase58String(p)
235274 case _ =>
236275 "WAVES"
237276 }
238277 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
239278 let parts = split(data, "_")
240279 let orderType = parts[0]
241280 let orderAmount = parseIntValue(parts[1])
242281 let orderAmountAsset = parts[2]
243282 let orderPriceAssetAmount = parseIntValue(parts[3])
244283 let orderPriceAsset = parts[4]
245284 let orderOwner = value(addressFromString(parts[5]))
246285 let orderAll = if ((parts[6] == "true"))
247286 then true
248287 else false
249288 let orderPassword = parts[7]
250289 let orderSpent = parseIntValue(parts[8])
251290 if ((orderType != "sell"))
252291 then throw("Invalid order type")
253292 else if ((orderPriceAsset != priceAsset))
254293 then throw(("Payment asset must be " + orderPriceAsset))
255294 else {
256295 let valid = if ((orderPassword != ""))
257296 then sigVerify(i.callerPublicKey, fromBase58String(sig), fromBase58String(orderPassword))
258297 else true
259298 if (!(valid))
260299 then throw("The order is private")
261300 else {
262301 let amount = ((priceAssetAmount * orderAmount) / orderPriceAssetAmount)
263302 if ((amount == 0))
264303 then throw("Invalid amount")
265304 else if (if (orderAll)
266305 then (orderAmount > amount)
267306 else false)
268307 then throw("You must take all or none")
269308 else if ((amount > (orderAmount - orderSpent)))
270309 then throw("Not enougth asset in order")
271310 else {
272311 let orders = match getString(this, "orders") {
273312 case s: String =>
274313 s
275314 case _: Unit =>
276315 ""
277316 case _ =>
278317 throw()
279318 }
280319 let newData = (dropRight(data, size(parts[8])) + toString((orderSpent + amount)))
281320 let index = value(indexOf(orders, orderId))
282321 let newOrders = if ((orderAmount == (amount + orderSpent)))
283322 then (take(orders, index) + drop(orders, ((index + size(orderId)) + 1)))
284323 else orders
285- ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(i.caller, amount, if ((orderAmountAsset == "WAVES"))
324+ let toCaller = ScriptTransfer(i.caller, amount, if ((orderAmountAsset == "WAVES"))
286325 then unit
287- else fromBase58String(orderAmountAsset)), ScriptTransfer(orderOwner, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
326+ else fromBase58String(orderAmountAsset))
327+ let toOwner = ScriptTransfer(orderOwner, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
288328 then unit
289- else fromBase58String(orderPriceAsset))]))
329+ else fromBase58String(orderPriceAsset))
330+ ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([toCaller, toOwner]))
290331 }
291332 }
292333 }
293334 }
294335 }
295336
296337
297338
298339 @Callable(i)
299340 func takeBuy (orderId,sig) = {
300341 let payment = valueOrErrorMessage(i.payment, "where is payment?")
301342 let amount = payment.amount
302343 if ((0 >= amount))
303344 then throw("amount must be positive")
304345 else {
305346 let amountAsset = match payment.assetId {
306347 case p: ByteVector =>
307348 toBase58String(p)
308349 case _ =>
309350 "WAVES"
310351 }
311352 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
312353 let parts = split(data, "_")
313354 let orderType = parts[0]
314355 let orderAmount = parseIntValue(parts[1])
315356 let orderAmountAsset = parts[2]
316357 let orderPriceAssetAmount = parseIntValue(parts[3])
317358 let orderPriceAsset = parts[4]
318359 let orderOwner = value(addressFromString(parts[5]))
319360 let orderAll = if ((parts[6] == "true"))
320361 then true
321362 else false
322363 let orderPassword = parts[7]
323364 let orderSpent = parseIntValue(parts[8])
324365 if ((orderType != "buy"))
325366 then throw("Invalid order type")
326367 else if ((orderAmountAsset != amountAsset))
327368 then throw(("payment asset must be " + orderAmountAsset))
328369 else {
329370 let valid = if ((orderPassword != ""))
330371 then sigVerify(i.callerPublicKey, fromBase58String(sig), fromBase58String(orderPassword))
331372 else true
332373 if (!(valid))
333374 then throw("The order is private")
334375 else {
335376 let priceAssetAmount = ((amount * orderPriceAssetAmount) / orderAmount)
336377 if ((priceAssetAmount == 0))
337378 then throw("Invalid amount")
338379 else if (if (orderAll)
339380 then (orderPriceAssetAmount > priceAssetAmount)
340381 else false)
341382 then throw("You must take all or none")
342383 else if ((priceAssetAmount > (orderPriceAssetAmount - orderSpent)))
343384 then throw("not enougth asset in order")
344385 else {
345386 let orders = match getString(this, "orders") {
346387 case s: String =>
347388 s
348389 case _: Unit =>
349390 ""
350391 case _ =>
351392 throw()
352393 }
353394 let newData = (dropRight(data, size(parts[8])) + toString((orderSpent + priceAssetAmount)))
354395 let index = value(indexOf(orders, orderId))
355396 let newOrders = if ((orderPriceAssetAmount == (priceAssetAmount + orderSpent)))
356397 then (take(orders, index) + drop(orders, ((index + size(orderId)) + 1)))
357398 else orders
358- ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(i.caller, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
399+ let toCaller = ScriptTransfer(i.caller, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
359400 then unit
360- else fromBase58String(orderPriceAsset)), ScriptTransfer(orderOwner, amount, if ((orderAmountAsset == "WAVES"))
401+ else fromBase58String(orderPriceAsset))
402+ let toOwner = ScriptTransfer(orderOwner, amount, if ((orderAmountAsset == "WAVES"))
361403 then unit
362- else fromBase58String(orderAmountAsset))]))
404+ else fromBase58String(orderAmountAsset))
405+ ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([toCaller, toOwner]))
363406 }
364407 }
365408 }
366409 }
367410 }
368411
369412
370413
371414 @Callable(i)
372415 func returnSell (orderId) = {
373416 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
374417 let parts = split(data, "_")
375418 let orderType = parts[0]
376419 let orderAmount = parseIntValue(parts[1])
377420 let orderAmountAsset = parts[2]
378421 let orderPriceAssetAmount = parseIntValue(parts[3])
379422 let orderPriceAsset = parts[4]
380423 let orderOwner = value(addressFromString(parts[5]))
381424 let orderAll = if ((parts[6] == "true"))
382425 then true
383426 else false
384427 let orderPassword = parts[7]
385428 let orderSpent = parseIntValue(parts[8])
386429 if ((orderType != "sell"))
387430 then throw("Invalid order type")
388431 else if ((orderOwner != i.caller))
389432 then throw("return should be called by order owner")
390433 else {
391434 let returnAmount = (orderAmount - orderSpent)
392435 if ((0 >= returnAmount))
393436 then throw("nothing to return")
394437 else {
395438 let orders = match getString(this, "orders") {
396439 case s: String =>
397440 s
398441 case _: Unit =>
399442 ""
400443 case _ =>
401444 throw()
402445 }
403446 let newData = (dropRight(data, size(parts[8])) + toString(orderAmount))
404447 let index = value(indexOf(orders, orderId))
405448 let newOrders = (take(orders, index) + drop(orders, ((index + size(orderId)) + 1)))
406449 ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(i.caller, returnAmount, if ((orderAmountAsset == "WAVES"))
407450 then unit
408451 else fromBase58String(orderAmountAsset))]))
409452 }
410453 }
411454 }
412455
413456
414457
415458 @Callable(i)
416459 func returnBuy (orderId) = {
417460 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
418461 let parts = split(data, "_")
419462 let orderType = parts[0]
420463 let orderAmount = parseIntValue(parts[1])
421464 let orderAmountAsset = parts[2]
422465 let orderPriceAssetAmount = parseIntValue(parts[3])
423466 let orderPriceAsset = parts[4]
424467 let orderOwner = value(addressFromString(parts[5]))
425468 let orderAll = if ((parts[6] == "true"))
426469 then true
427470 else false
428471 let orderPassword = parts[7]
429472 let orderSpent = parseIntValue(parts[8])
430473 if ((orderType != "buy"))
431474 then throw("Invalid order type")
432475 else if ((orderOwner != i.caller))
433476 then throw("Return should be called by order owner")
434477 else {
435478 let returnAmount = (orderPriceAssetAmount - orderSpent)
436479 if ((0 >= returnAmount))
437480 then throw("nothing to return")
438481 else {
439482 let orders = match getString(this, "orders") {
440483 case s: String =>
441484 s
442485 case _: Unit =>
443486 ""
444487 case _ =>
445488 throw()
446489 }
447490 let newData = (dropRight(data, size(parts[8])) + toString(orderPriceAssetAmount))
448491 let index = value(indexOf(orders, orderId))
449492 let newOrders = (take(orders, index) + drop(orders, ((index + size(orderId)) + 1)))
450493 ScriptResult(WriteSet([DataEntry("orders", newOrders), DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(i.caller, returnAmount, if ((orderPriceAsset == "WAVES"))
451494 then unit
452495 else fromBase58String(orderPriceAsset))]))
453496 }
454497 }
455498 }
456499
457500

github/deemru/w8io/873ac7e 
132.10 ms