tx · 8sP4BoxVNEnWKnVwVkJKias79N5NQNeWbM5N6hdYn9Cf

3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2:  -0.01500000 Waves

2019.10.03 18:49 [703733] smart account 3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2 > SELF 0.00000000 Waves

{ "type": 13, "id": "8sP4BoxVNEnWKnVwVkJKias79N5NQNeWbM5N6hdYn9Cf", "fee": 1500000, "feeAssetId": null, "timestamp": 1570117713095, "version": 1, "sender": "3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2", "senderPublicKey": "8y2Uc9uYf5gRD6Dzm1aC73zYe3LZvtVDUVAnAhNdN2mg", "proofs": [ "2rqvPet7WW4mxABZDaeGRRagCxgbYg5qKQSm2YMPmMD7uprMhvNMfyfF31jcJm6DRLc2Jmjtw7L7xf7E5ksjLNJc" ], "script": "base64:AAIDAAAAAAAAAD8IARIDCgEIEgMKAQgSBQoDAQEIEgQKAggBEgQKAggIEgQKAggBEgMKAQgSAwoBCBIECgIICBIDCgEIEgMKAQgAAAAjAAAAAANkYXkAAAAAAAAABaAAAAAABVdBVkVTBQAAAAR1bml0AAAAAAR3QlRDAQAAACBs+mr/xe2qjAt/tSqT0qIML4KC23R6BIxT+/0TH3Og/wAAAAAEd0VVUgEAAAAg7BZhBF97kSFBBjs38+fX1Pjz08YOqoCX85C/0PoVupkAAAAABHdVU0QBAAAAIN0cvQHwz3UFMHgHsqi2OJjRRd1cH7ozWuNAb/pmWXD9AAAAAAlzdGF0ZU9wZW4CAAAABk9wZW5lZAAAAAAOc3RhdGVTdWdnZXN0ZWQCAAAACVN1Z2dlc3RlZAAAAAALc3RhdGVDYW5jZWwCAAAACENhbmNlbGVkAAAAAA9zdGF0ZUluUHJvZ3Jlc3MCAAAACkluUHJvZ3Jlc3MAAAAAEXN0YXRlV2FpdDRDb25maXJtAgAAABNXYWl0Rm9yQ29uZmlybWF0aW9uAAAAAA1zdGF0ZUNvbXBsZXRlAgAAAAlDb21wbGV0ZWQAAAAADHN0YXRlRGlzcHV0ZQIAAAAHRGlzcHV0ZQAAAAAUc3RhdGVEaXNwdXRlUmVzb2x2ZWQCAAAAD0Rpc3B1dGVSZXNvbHZlZAAAAAAGY2xpZW50AgAAAANDTVIAAAAACmZyZWVsYW5jZXICAAAAAkZMAAAAAAthbWJhc3NhZG9yMQEAAAABAAAAAAALYW1iYXNzYWRvcjIBAAAAAQAAAAAAC2FtYmFzc2Fkb3IzAQAAAAEAAAAAAAthbWJhc3NhZG9yNAEAAAABAAAAAAALYW1iYXNzYWRvcjUBAAAAAQABAAAAEEF1Y3Rpb25JZERhdGFLZXkAAAABAAAACWF1Y3Rpb25JZAkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9BdWN0aW9uRGF0YQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABAAAAEGF1Y3Rpb25Bc3NldE5hbWUDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAABVdBVkVTBQAAAAVXQVZFUwMJAAAAAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAADQlRDBQAAAAR3QlRDAwkAAAAAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAANFVVIFAAAABHdFVVIDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAAA1VTRAUAAAAEd1VTRAkAAAIAAAABAgAAABJJbmNvcnJlY3QgQXNzZXQgSWQBAAAACXRpbWVDaGVjawAAAAMAAAALY3VycmVudFRpbWUAAAAJc3RhcnRUaW1lAAAADmV4cGlyYXRpb25UaW1lCQAAZgAAAAIJAABlAAAAAgUAAAALY3VycmVudFRpbWUFAAAACXN0YXJ0VGltZQUAAAAOZXhwaXJhdGlvblRpbWUBAAAAFmluY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACAAAADHBtdEFzc2V0TmFtZQAAAAxhdWN0aW9uUHJpY2UEAAAAD2tleUZyZWV6ZWRGdW5kcwkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADHBtdEFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQEAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQQAAAAHJG1hdGNoMAUAAAAPa2V5RnJlZXplZEZ1bmRzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAJAABkAAAAAgUAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBQAAAAxhdWN0aW9uUHJpY2UBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACAAAADHBtdEFzc2V0TmFtZQAAAAxhdWN0aW9uUHJpY2UEAAAAD2tleUZyZWV6ZWRGdW5kcwkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADHBtdEFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQEAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQQAAAAHJG1hdGNoMAUAAAAPa2V5RnJlZXplZEZ1bmRzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAEAAAAAWEJAABlAAAAAgUAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBQAAAAxhdWN0aW9uUHJpY2UDCQAAZgAAAAIFAAAAAWEAAAAAAAAAAAAFAAAAAWEJAAACAAAAAQIAAAAmRnJlZXplZCBhbW91bnQgY291bGRuJ3QgYmUgbGVzcyB0aGFuIDABAAAAFmZyZWVsYW5jZXJJc1JlZ2lzdGVyZWQAAAABAAAACWNhbGxlclB1YgQAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWNhbGxlclB1YgIAAAALX0ZyZWVsYW5jZXIEAAAAByRtYXRjaDAFAAAAFmZyZWVsYW5jZXJJc1JlZ2lzdGVyZWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAAJY2FsbGVyUHViCQAAAgAAAAECAAAAI09ubHkgcmVnaXN0ZXJlZCB1c2VycyBjYW4gbWFrZSBiZXRzAQAAABdjcmVhdGVBdWN0aW9uUHJpY2VDaGVjawAAAAEAAAAJcG10QW1vdW50AwkAAGYAAAACBQAAAAlwbXRBbW91bnQAAAAAAAAAAAAFAAAACXBtdEFtb3VudAkAAAIAAAABAgAAABxBbW91bnQgbXVzdCBiZSBoaWdoZXIgdGhlbiAwAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABAAAACWF1Y3Rpb25JZAQAAAAKdmFsdWVTdGF0ZQkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBAAAAAckbWF0Y2gwBQAAAAp2YWx1ZVN0YXRlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAbQXVjdGlvbiBTdGF0ZSB3YXMgbm90IGZvdW5kAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQAAAAlhdWN0aW9uSWQEAAAAC3ZhbHVlQ2xpZW50CQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA5fQXVjdGlvbkNsaWVudAQAAAABYQQAAAAHJG1hdGNoMAUAAAALdmFsdWVDbGllbnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABxBdWN0aW9uIENsaWVudCB3YXMgbm90IGZvdW5kCQACWQAAAAEFAAAAAWEBAAAAE2dldEF1Y3Rpb25TdGFydFRpbWUAAAABAAAACWF1Y3Rpb25JZAQAAAARdmFsdWVBdWN0aW9uU3RhcnQJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADV9BdWN0aW9uU3RhcnQEAAAAByRtYXRjaDAFAAAAEXZhbHVlQXVjdGlvblN0YXJ0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAgQXVjdGlvbiBTdGFydCB0aW1lIHdhcyBub3QgZm91bmQBAAAAFmdldEF1Y3Rpb25EdXJhdGlvblRpbWUAAAABAAAACWF1Y3Rpb25JZAQAAAAUdmFsdWVhdWN0aW9uRHVyYXRpb24JAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9BdWN0aW9uRHVyYXRpb24EAAAAByRtYXRjaDAFAAAAFHZhbHVlYXVjdGlvbkR1cmF0aW9uAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAjQXVjdGlvbiBkdXJhdGlvbiB0aW1lIHdhcyBub3QgZm91bmQBAAAAHGdldEF1Y3Rpb25Kb2JQZXJmb3JtYW5jZVRpbWUAAAABAAAACWF1Y3Rpb25JZAQAAAAXdmFsdWVCbG9ja3NGb3JFeGVjdXRpb24JAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAD19Kb2JQZXJmb3JtYW5jZQQAAAAHJG1hdGNoMAUAAAAXdmFsdWVCbG9ja3NGb3JFeGVjdXRpb24DCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACpBdWN0aW9uIGpvYiBwZXJmb3JtYW5jZSB0aW1lIHdhcyBub3QgZm91bmQBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABAAAACWF1Y3Rpb25JZAQAAAAOdmFsdWVBc3NldE5hbWUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAACl9Bc3NldE5hbWUEAAAAByRtYXRjaDAFAAAADnZhbHVlQXNzZXROYW1lAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAgQXVjdGlvbiBhc3NldCBuYW1lIHdhcyBub3QgZm91bmQBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEAAAAJYXVjdGlvbklkBAAAAAp2YWx1ZVByaWNlCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UEAAAAByRtYXRjaDAFAAAACnZhbHVlUHJpY2UDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABtBdWN0aW9uIHByaWNlIHdhcyBub3QgZm91bmQBAAAAF2dldEF1Y3Rpb25GcmVlbGFuY2VyUHViAAAAAQAAAAlhdWN0aW9uSWQEAAAAC3ZhbHVlQ2xpZW50CQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfSGlyZWRGcmVlbGFuY2VyBAAAAAFhBAAAAAckbWF0Y2gwBQAAAAt2YWx1ZUNsaWVudAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAHEF1Y3Rpb24gQ2xpZW50IHdhcyBub3QgZm91bmQJAAJZAAAAAQUAAAABYQAAAAsAAAABaQEAAAAQZnJlZWxhbmNlclNpZ25VcAAAAAEAAAAEaW5mbwQAAAANdXNlclB1YmxpY0tleQkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX0ZyZWVsYW5jZXIDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAACAAAAAQIAAAAXVXNlciBhbHJlYWR5IHJlZ2lzdGVyZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX0ZyZWVsYW5jZXIFAAAABGluZm8FAAAAA25pbAAAAAFpAQAAAAxjbGllbnRTaWduVXAAAAABAAAABGluZm8EAAAADXVzZXJQdWJsaWNLZXkJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAABFhbHJlYWR5UmVnaXN0ZXJlZAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAAB19DbGllbnQDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAACAAAAAQIAAAAXVXNlciBhbHJlYWR5IHJlZ2lzdGVyZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAAHX0NsaWVudAUAAAAEaW5mbwUAAAADbmlsAAAAAWkBAAAADWNyZWF0ZUF1Y3Rpb24AAAADAAAAEGpvYkV4ZWN1dGlvbkRheXMAAAATYXVjdGlvbkR1cmF0aW9uRGF5cwAAAAthdWN0aW9uSW5mbwQAAAAJYXVjdGlvbklkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAJcG10QW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAMYXVjdGlvblByaWNlCQEAAAAXY3JlYXRlQXVjdGlvblByaWNlQ2hlY2sAAAABBQAAAAlwbXRBbW91bnQEAAAADGF1Y3Rpb25TdGFydAUAAAAGaGVpZ2h0BAAAABVhdWN0aW9uRHVyYXRpb25CbG9ja3MJAABoAAAAAgUAAAATYXVjdGlvbkR1cmF0aW9uRGF5cwUAAAADZGF5BAAAABJibG9ja3NGb3JFeGVjdXRpb24JAABoAAAAAgUAAAAQam9iRXhlY3V0aW9uRGF5cwUAAAADZGF5BAAAAAxwbXRBc3NldE5hbWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQCAAAABVdBVkVTAwkAAAAAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAABHdCVEMCAAAAA0JUQwMJAAAAAAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAAR3RVVSAgAAAANFVVIDCQAAAAAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAEd1VTRAIAAAADVVNECQAAAgAAAAECAAAAFEFzc2V0SWQgaXMgaW5jb3JyZWN0BAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmluY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAAAxwbXRBc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAJc3RhdGVPcGVuCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0luZm8FAAAAC2F1Y3Rpb25JbmZvCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAOX0F1Y3Rpb25DbGllbnQFAAAADWF1Y3Rpb25DbGllbnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fQXVjdGlvblN0YXJ0BQAAAAxhdWN0aW9uU3RhcnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfQXVjdGlvbkR1cmF0aW9uBQAAABVhdWN0aW9uRHVyYXRpb25CbG9ja3MJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA9fSm9iUGVyZm9ybWFuY2UFAAAAEmJsb2Nrc0ZvckV4ZWN1dGlvbgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAACl9Bc3NldE5hbWUFAAAADHBtdEFzc2V0TmFtZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9QcmljZQUAAAAMYXVjdGlvblByaWNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADHBtdEFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwAAAABaQEAAAAHbWFrZUJpZAAAAAIAAAAJYXVjdGlvbklkAAAACGJldFByaWNlBAAAAAljYWxsZXJQdWIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAdiZXRUaW1lBQAAAAZoZWlnaHQEAAAADGF1Y3Rpb25TdGF0ZQkBAAAAD2dldEF1Y3Rpb25TdGF0ZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAANYXVjdGlvbkNsaWVudAkBAAAAE2dldEF1Y3Rpb25DbGllbnRQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGFydAkBAAAAE2dldEF1Y3Rpb25TdGFydFRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAD2F1Y3Rpb25EdXJhdGlvbgkBAAAAFmdldEF1Y3Rpb25EdXJhdGlvblRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAGWF1Y3Rpb25CbG9ja3NGb3JFeGVjdXRpb24JAQAAABxnZXRBdWN0aW9uSm9iUGVyZm9ybWFuY2VUaW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXROYW1lCQEAAAATZ2V0QXVjdGlvbkFzc2V0TmFtZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblByaWNlCQEAAAAPZ2V0QXVjdGlvblByaWNlAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABBQAAABBhdWN0aW9uQXNzZXROYW1lBAAAAA1uZXdGcmVlbGFuY2VyCQEAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAAAAAEFAAAACWNhbGxlclB1YgQAAAAOZEFwcENvbW1pc3Npb24JAABpAAAAAgkAAGgAAAACBQAAAAxhdWN0aW9uUHJpY2UAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQEAAAAWZGVjcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQQAAAARYXVjdGlvblRpbWVpc092ZXIJAQAAAAl0aW1lQ2hlY2sAAAADBQAAAAdiZXRUaW1lBQAAAAxhdWN0aW9uU3RhcnQFAAAAD2F1Y3Rpb25EdXJhdGlvbgMFAAAAEWF1Y3Rpb25UaW1laXNPdmVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAC3N0YXRlQ2FuY2VsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWF1Y3Rpb25DbGllbnQJAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAA5kQXBwQ29tbWlzc2lvbgUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAADnN0YXRlU3VnZ2VzdGVkBAAAABNhdWN0aW9uTG93ZXN0QmlkZGVyBAAAABF2YWx1ZUxvd2VzdEJpZGRlcgkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0xvd2VzdEJpZGRlclB1YgQAAAAHJG1hdGNoMAUAAAARdmFsdWVMb3dlc3RCaWRkZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACNBdWN0aW9uIGxvd2VzdCBiaWRkZXIgd2FzIG5vdCBmb3VuZAQAAAAPbmV3QXVjdGlvblByaWNlBAAAABR2YWx1ZU5ld0F1Y3Rpb25QcmljZQkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAVfQmlkXwUAAAATYXVjdGlvbkxvd2VzdEJpZGRlcgQAAAAHJG1hdGNoMAUAAAAUdmFsdWVOZXdBdWN0aW9uUHJpY2UDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACBBdWN0aW9uIGxvd2VzdCBiaWQgd2FzIG5vdCBmb3VuZAQAAAAQYW1vdW50RGlmZmVyZW5jZQkAAGUAAAACCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAPbmV3QXVjdGlvblByaWNlBQAAAA5kQXBwQ29tbWlzc2lvbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAD3N0YXRlSW5Qcm9ncmVzcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9IaXJlZEZyZWVsYW5jZXIFAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UFAAAAD25ld0F1Y3Rpb25QcmljZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWF1Y3Rpb25DbGllbnQFAAAAEGFtb3VudERpZmZlcmVuY2UFAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAABdJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZQMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAlzdGF0ZU9wZW4JAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAAA1uZXdGcmVlbGFuY2VyBQAAAAhiZXRQcmljZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBQAAAAljYWxsZXJQdWIFAAAAA25pbAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA5zdGF0ZVN1Z2dlc3RlZAQAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgQAAAAMbG93ZXN0QmlkZGVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBAAAAAckbWF0Y2gwBQAAAAxsb3dlc3RCaWRkZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACNBdWN0aW9uIGxvd2VzdCBiaWRkZXIgd2FzIG5vdCBmb3VuZAQAAAASbmV3TG93ZXN0QmlkZGVyUHViBAAAABV2YWx1ZUN1cnJlbnRMb3dlc3RCaWQJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAAFmN1cnJlbnRMb3dlc3RCaWRkZXJQdWIEAAAAEGN1cnJlbnRMb3dlc3RCaWQEAAAAByRtYXRjaDAFAAAAFXZhbHVlQ3VycmVudExvd2VzdEJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gbG93ZXN0IGJpZCB3YXMgbm90IGZvdW5kAwkAAGYAAAACBQAAABBjdXJyZW50TG93ZXN0QmlkBQAAAAhiZXRQcmljZQUAAAANbmV3RnJlZWxhbmNlcgUAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9Mb3dlc3RCaWRkZXJQdWIFAAAAEm5ld0xvd2VzdEJpZGRlclB1YgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAADW5ld0ZyZWVsYW5jZXIFAAAACGJldFByaWNlBQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHEluY29ycmVjdCBqb2JJZCBzdGF0ZS4gTm93OiAFAAAADGF1Y3Rpb25TdGF0ZQIAAAALLCBtdXN0IGJlOiAFAAAACXN0YXRlT3BlbgIAAAAEIG9yIAUAAAAOc3RhdGVTdWdnZXN0ZWQAAAABaQEAAAAQY2hvb3NlRnJlZWxhbmNlcgAAAAIAAAAJYXVjdGlvbklkAAAADWZyZWVsYW5jZXJQdWIEAAAACWNhbGxlclB1YgkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAB2JldFRpbWUFAAAABmhlaWdodAQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXJ0CQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0TmFtZQkBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25QcmljZQkBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0SWQ1OAkBAAAAEUFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAATZnJlZWxhbmNlckJpZEFtb3VudAQAAAAQa2V5RnJlZWxhbmNlckJpZAkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAADWZyZWVsYW5jZXJQdWIEAAAAEXZhbHVlRnJlZWxhY2VyQmlkCQAEGgAAAAIFAAAABHRoaXMFAAAAEGtleUZyZWVsYW5jZXJCaWQEAAAAByRtYXRjaDAFAAAAEXZhbHVlRnJlZWxhY2VyQmlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAeRnJlZWxhbmNlcidzIGJldCB3YXMgbm90IGZvdW5kBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAAE2ZyZWVsYW5jZXJCaWRBbW91bnQAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEWF1Y3Rpb25UaW1laXNPdmVyCQEAAAAJdGltZUNoZWNrAAAAAwUAAAAHYmV0VGltZQUAAAAMYXVjdGlvblN0YXJ0BQAAAA9hdWN0aW9uRHVyYXRpb24DCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAANYXVjdGlvbkNsaWVudAMFAAAAEWF1Y3Rpb25UaW1laXNPdmVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAALc3RhdGVDYW5jZWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQUAAAANYXVjdGlvbkNsaWVudAkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAADmRBcHBDb21taXNzaW9uBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQEAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIEAAAAEXZhbHVlTG93ZXN0QmlkZGVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBAAAAAckbWF0Y2gwBQAAABF2YWx1ZUxvd2VzdEJpZGRlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAI0F1Y3Rpb24gbG93ZXN0IGJpZGRlciB3YXMgbm90IGZvdW5kBAAAAA9uZXdBdWN0aW9uUHJpY2UEAAAAFHZhbHVlTmV3QXVjdGlvblByaWNlCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAABNhdWN0aW9uTG93ZXN0QmlkZGVyBAAAAAckbWF0Y2gwBQAAABR2YWx1ZU5ld0F1Y3Rpb25QcmljZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gbG93ZXN0IGJpZCB3YXMgbm90IGZvdW5kBAAAABBhbW91bnREaWZmZXJlbmNlCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAPbmV3QXVjdGlvblByaWNlBAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lBQAAABBhbW91bnREaWZmZXJlbmNlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0hpcmVkRnJlZWxhbmNlcgUAAAATYXVjdGlvbkxvd2VzdEJpZGRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9QcmljZQUAAAAPbmV3QXVjdGlvblByaWNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWF1Y3Rpb25DbGllbnQFAAAAEGFtb3VudERpZmZlcmVuY2UFAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAABdJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZQQAAAAQc2V0TmV3RnJlZWxhbmNlcgQAAAANbmV3RnJlZWxhbmNlcgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAVfQmlkXwUAAAANZnJlZWxhbmNlclB1YgQAAAAHJG1hdGNoMAUAAAANbmV3RnJlZWxhbmNlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAA1mcmVlbGFuY2VyUHViCQAAAgAAAAECAAAAHkVycm9yOiBJbmNvcnJlY3QgZnJlZWxhbmNlclB1YgQAAAAPbmV3QXVjdGlvblByaWNlBAAAAA1mcmVlbGFuY2VyQmlkCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAAA1mcmVlbGFuY2VyUHViBAAAAAckbWF0Y2gwBQAAAA1mcmVlbGFuY2VyQmlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAjQXVjdGlvbiBsb3dlc3QgYmlkZGVyIHdhcyBub3QgZm91bmQEAAAAEGFtb3VudERpZmZlcmVuY2UJAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAABNmcmVlbGFuY2VyQmlkQW1vdW50BAAAABFuZXdGcmVlemVkQmFsYW5jZQkBAAAAFmRlY3JlYXNlRnJlZXplZEJhbGFuY2UAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lBQAAABBhbW91bnREaWZmZXJlbmNlCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0hpcmVkRnJlZWxhbmNlcgUAAAAQc2V0TmV3RnJlZWxhbmNlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9QcmljZQUAAAAPbmV3QXVjdGlvblByaWNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWF1Y3Rpb25DbGllbnQJAABlAAAAAgUAAAAQYW1vdW50RGlmZmVyZW5jZQUAAAAOZEFwcENvbW1pc3Npb24FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAAC1Pbmx5IGF1Y3Rpb24gY3VzdG9tZXIgY2FuIGNob29zZSBhIGZyZWVsYW5jZXIAAAABaQEAAAAVaW5jcmVhc2VFeGVjdXRpb25UaW1lAAAAAgAAAAlhdWN0aW9uSWQAAAANZXhlY3V0aW9uRGF5cwQAAAAGY2FsbGVyCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgkBAAAAHGdldEF1Y3Rpb25Kb2JQZXJmb3JtYW5jZVRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAF25ld0F1Y3Rpb25FeGVjdXRpb25UaW1lBAAAABxuZXdBdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQAAaAAAAAIFAAAADWV4ZWN1dGlvbkRheXMFAAAAA2RheQMJAABmAAAAAgUAAAAcbmV3QXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgUAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgUAAAAcbmV3QXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgkAAAIAAAABAgAAADhOZXcgZXhlY3V0aW9uIHRpbWUgbXVzdCBtb3JlIHRoYW4gY3VycmVudCBleGVjdXRpb24gdGltZQMJAAAAAAAAAgUAAAAGY2FsbGVyBQAAAA1hdWN0aW9uQ2xpZW50AwMDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAJc3RhdGVPcGVuBgkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAADnN0YXRlU3VnZ2VzdGVkBgkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAAD3N0YXRlSW5Qcm9ncmVzcwkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAD19Kb2JQZXJmb3JtYW5jZQUAAAAXbmV3QXVjdGlvbkV4ZWN1dGlvblRpbWUFAAAAA25pbAkAAAIAAAABAgAAAA9JbmNvcnJlY3Qgc3RhdGUJAAACAAAAAQIAAAAnT25seSBDbGllbnQgY2FuIGluY3JlYXNlIGV4ZWN1dGlvbiB0aW1lAAAAAWkBAAAADWNhbmNlbEF1Y3Rpb24AAAABAAAACWF1Y3Rpb25JZAQAAAAJY2FsbGVyUHViCQEAAAAHZXh0cmFjdAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0TmFtZQkBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25QcmljZQkBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0SWQ1OAkBAAAAEUFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAAOZEFwcENvbW1pc3Npb24JAABpAAAAAgkAAGgAAAACBQAAAAxhdWN0aW9uUHJpY2UAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEWFtb3VudFdpdGhvdXRDb21tCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAOZEFwcENvbW1pc3Npb24EAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQEAAAAWZGVjcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQQAAAAOY2FsbGVySXNDbGllbnQDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAANYXVjdGlvbkNsaWVudAYJAAACAAAAAQIAAAAuQXVjdGlvbiBjYW4gYmUgY2FuY2VsZWQgb25seSBieSBhdWN0aW9uIG93bmVyLgMFAAAADmNhbGxlcklzQ2xpZW50AwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAC3N0YXRlQ2FuY2VsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADWF1Y3Rpb25DbGllbnQFAAAAEWFtb3VudFdpdGhvdXRDb21tBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwJAAACAAAAAQIAAAAYSW5jb3JyZWN0IGF1Y3Rpb24gc3RhdGUuCQAAAgAAAAECAAAAHk9ubHkgQ2xpZW50IGNhbiBjYW5jZWwgYXVjdGlvbgAAAAFpAQAAAAtvcGVuRGlzcHV0ZQAAAAEAAAAJYXVjdGlvbklkBAAAAAZjYWxsZXIJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABFhdWN0aW9uRnJlZWxhbmNlcgkBAAAAF2dldEF1Y3Rpb25GcmVlbGFuY2VyUHViAAAAAQUAAAAJYXVjdGlvbklkAwMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAlzdGF0ZU9wZW4GCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQJAAACAAAAAQIAAAArSW5jb3JyZWN0IGF1Y3Rpb24gc3RhdGUgZm9yIGRpc3B1dGUgb3BlbmluZwMDCQAAAAAAAAIFAAAABmNhbGxlcgUAAAANYXVjdGlvbkNsaWVudAYJAAAAAAAAAgUAAAAGY2FsbGVyBQAAABFhdWN0aW9uRnJlZWxhbmNlcgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAMc3RhdGVEaXNwdXRlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0Rpc3B1dGVWb3RlcwAAAAAAAAAAAAUAAAADbmlsCQAAAgAAAAECAAAALU9ubHkgY3VzdG9tZXIgYW5kIGZyZWVsYW5jZXIgY2FuIG9wZW4gZGlzcHV0ZQAAAAFpAQAAAAt2b3RlRGlzcHV0ZQAAAAIAAAAJYXVjdGlvbklkAAAABHZvdGUEAAAACWNhbGxlclB1YgkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAADGF1Y3Rpb25TdGF0ZQkBAAAAD2dldEF1Y3Rpb25TdGF0ZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAANYXVjdGlvbkNsaWVudAkBAAAAE2dldEF1Y3Rpb25DbGllbnRQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Bc3NldE5hbWUJAQAAABNnZXRBdWN0aW9uQXNzZXROYW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAAAxhdWN0aW9uUHJpY2UJAQAAAA9nZXRBdWN0aW9uUHJpY2UAAAABBQAAAAlhdWN0aW9uSWQEAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAXZ2V0QXVjdGlv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ZXIAAAAAAAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAFHN0YXRlRGlzcHV0ZVJlc29sdmVkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAxfRGlwdXRlVm90ZV8FAAAAEmNhbGxlcklzQW1iYXNzYWRvcgUAAAAHbmV3Vm90ZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAAhfRnJlZXplZAUAAAARbmV3RnJlZXplZEJhbGFuY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABBQAAAA1kaXNwdXRlV2lubmVyBQAAABJwYXltZW50V2l0aG91dENvbW0FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADV9EaXNwdXRlVm90ZXMJAABkAAAAAgUAAAALdm90ZXNOdW1iZXIAAAAAAAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9EaXB1dGVWb3RlXwUAAAASY2FsbGVySXNBbWJhc3NhZG9yBQAAAAduZXdWb3RlBQAAAANuaWwJAAACAAAAAQkAASwAAAACAgAAABpJbmNvcnJlY3Qgc3RhdGUuIE11c3QgYmU6IAUAAAAMc3RhdGVEaXNwdXRlAAAAAWkBAAAADHdvcmtIYW5kT3ZlcgAAAAEAAAAJYXVjdGlvbklkBAAAAAljYWxsZXJQdWIJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGFydAkBAAAAE2dldEF1Y3Rpb25TdGFydFRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAD2F1Y3Rpb25EdXJhdGlvbgkBAAAAFmdldEF1Y3Rpb25EdXJhdGlvblRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAGWF1Y3Rpb25CbG9ja3NGb3JFeGVjdXRpb24JAQAAABxnZXRBdWN0aW9uSm9iUGVyZm9ybWFuY2VUaW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAABFhdWN0aW9uRnJlZWxhbmNlcgkBAAAAF2dldEF1Y3Rpb25GcmVlbGFuY2VyUHViAAAAAQUAAAAJYXVjdGlvbklkBAAAAAtjdXJyZW50VGltZQUAAAAGaGVpZ2h0BAAAABJmcmVlbGFuY2VyUHViQ2hlY2sDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAARYXVjdGlvbkZyZWVsYW5jZXIFAAAACWNhbGxlclB1YgkAAAIAAAABAgAAADRPbmx5IGEgZnJlZWxhbmNlciBjYW4gaW5kaWNhdGUgdGhhdCB0aGUgd29yayBpcyBkb25lBAAAAAp0aW1lSXNPdmVyCQAAZgAAAAIJAABlAAAAAgUAAAALY3VycmVudFRpbWUFAAAADGF1Y3Rpb25TdGFydAUAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA9zdGF0ZUluUHJvZ3Jlc3MDBQAAAAp0aW1lSXNPdmVyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBQAAAAxzdGF0ZURpc3B1dGUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fRGlzcHV0ZVZvdGVzAgAAAAEwBQAAAANuaWwJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAEXN0YXRlV2FpdDRDb25maXJtBQAAAANuaWwJAAACAAAAAQIAAAAaQXVjdGlvbiBzdGF0ZSBpcyBpbmNvcnJlY3QAAAABaQEAAAAKYWNjZXB0V29yawAAAAEAAAAJYXVjdGlvbklkBAAAAAljYWxsZXJQdWIJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAAAxhdWN0aW9uU3RhcnQJAQAAABNnZXRBdWN0aW9uU3RhcnRUaW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAAA9hdWN0aW9uRHVyYXRpb24JAQAAABZnZXRBdWN0aW9uRHVyYXRpb25UaW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXROYW1lCQEAAAATZ2V0QXVjdGlvbkFzc2V0TmFtZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblByaWNlCQEAAAAPZ2V0QXVjdGlvblByaWNlAAAAAQUAAAAJYXVjdGlvbklkBAAAABFhdWN0aW9uRnJlZWxhbmNlcgkBAAAAF2dldEF1Y3Rpb25GcmVlbGFuY2VyUHViAAAAAQUAAAAJYXVjdGlvbklkBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAADGF1Y3Rpb25QcmljZQAAAAAAAAAAAwAAAAAAAAAAZAQAAAARYW1vdW50V2l0aG91dENvbW0JAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAA5kQXBwQ29tbWlzc2lvbgQAAAAQYXVjdGlvbkFzc2V0SWQ1OAkBAAAAEUFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlBAAAAAluZXdSYXRpbmcEAAAAC3ZhbHVlUmF0aW5nCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAAlgAAAABBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAAHX1JhdGluZwQAAAANY3VycmVudFJhdGluZwQAAAAHJG1hdGNoMAUAAAALdmFsdWVSYXRpbmcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAkAAGQAAAACBQAAAA1jdXJyZW50UmF0aW5nAAAAAAAAAAABAwkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAADWF1Y3Rpb25DbGllbnQDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAARc3RhdGVXYWl0NENvbmZpcm0JAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBQAAAA1zdGF0ZUNvbXBsZXRlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAJYAAAAAQUAAAARYXVjdGlvbkZyZWVsYW5jZXICAAAAB19SYXRpbmcFAAAACW5ld1JhdGluZwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAAhfRnJlZXplZAUAAAARbmV3RnJlZXplZEJhbGFuY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABBQAAABFhdWN0aW9uRnJlZWxhbmNlcgUAAAARYW1vdW50V2l0aG91dENvbW0FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABCQABLAAAAAICAAAAGkluY29ycmVjdCBzdGF0ZS4gTXVzdCBiZTogBQAAABFzdGF0ZVdhaXQ0Q29uZmlybQkAAAIAAAABAgAAACtPbmx5IGF1Y3Rpb24gY3VzdG9tZXIgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAADdHR4BQAAAAckbWF0Y2gwBgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAAAAA3N0eAUAAAAHJG1hdGNoMAYHB/BUZG0=", "chainId": 84, "height": 703733, "spentComplexity": 0 } View: original | compacted Prev: 2e9DKsK2rCgq7KyhbBeoM1SoEcKyMyJnYUdRVYYa4JP5 Next: G6XrdpuPoXrMGiysYoYPG92eSn1A33JJ3Bk4UHeYA7fr Diff:
OldNewDifferences
113113
114114
115115 func getAuctionClientPub (auctionId) = {
116- let valueClient = getString(this, (auctionId + "_Client"))
116+ let valueClient = getString(this, (auctionId + "_AuctionClient"))
117117 let a = match valueClient {
118118 case a: String =>
119119 a
233233 then "USD"
234234 else throw("AssetId is incorrect")
235235 let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
236- WriteSet([DataEntry((auctionId + "_State"), stateOpen), DataEntry((auctionId + "_Info"), auctionInfo), DataEntry((auctionId + "_Client"), auctionClient), DataEntry((auctionId + "_AuctionStart"), auctionStart), DataEntry((auctionId + "_AuctionDuration"), auctionDurationBlocks), DataEntry((auctionId + "_JobPerformance"), blocksForExecution), DataEntry((auctionId + "_AssetName"), pmtAssetName), DataEntry((auctionId + "_Price"), auctionPrice), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
236+ WriteSet([DataEntry((auctionId + "_State"), stateOpen), DataEntry((auctionId + "_Info"), auctionInfo), DataEntry((auctionId + "_AuctionClient"), auctionClient), DataEntry((auctionId + "_AuctionStart"), auctionStart), DataEntry((auctionId + "_AuctionDuration"), auctionDurationBlocks), DataEntry((auctionId + "_JobPerformance"), blocksForExecution), DataEntry((auctionId + "_AssetName"), pmtAssetName), DataEntry((auctionId + "_Price"), auctionPrice), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
237237 }
238238
239239
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let day = 1440
55
66 let WAVES = unit
77
88 let wBTC = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
99
1010 let wEUR = base58'Gtb1WRznfchDnTh37ezoDTJ4wcoKaRsKqKjJjy7nm2zU'
1111
1212 let wUSD = base58'Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck'
1313
1414 let stateOpen = "Opened"
1515
1616 let stateSuggested = "Suggested"
1717
1818 let stateCancel = "Canceled"
1919
2020 let stateInProgress = "InProgress"
2121
2222 let stateWait4Confirm = "WaitForConfirmation"
2323
2424 let stateComplete = "Completed"
2525
2626 let stateDispute = "Dispute"
2727
2828 let stateDisputeResolved = "DisputeResolved"
2929
3030 let client = "CMR"
3131
3232 let freelancer = "FL"
3333
3434 let ambassador1 = base58'1'
3535
3636 let ambassador2 = base58'1'
3737
3838 let ambassador3 = base58'1'
3939
4040 let ambassador4 = base58'1'
4141
4242 let ambassador5 = base58'1'
4343
4444 func AuctionIdDataKey (auctionId) = (auctionId + "_AuctionData")
4545
4646
4747 func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES"))
4848 then WAVES
4949 else if ((auctionAssetName == "BTC"))
5050 then wBTC
5151 else if ((auctionAssetName == "EUR"))
5252 then wEUR
5353 else if ((auctionAssetName == "USD"))
5454 then wUSD
5555 else throw("Incorrect Asset Id")
5656
5757
5858 func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime)
5959
6060
6161 func increaseFreezedBalance (pmtAssetName,auctionPrice) = {
6262 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
6363 let currentFreezedBalance = match keyFreezedFunds {
6464 case a: Int =>
6565 a
6666 case _ =>
6767 0
6868 }
6969 (currentFreezedBalance + auctionPrice)
7070 }
7171
7272
7373 func decreaseFreezedBalance (pmtAssetName,auctionPrice) = {
7474 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
7575 let currentFreezedBalance = match keyFreezedFunds {
7676 case a: Int =>
7777 a
7878 case _ =>
7979 0
8080 }
8181 let a = (currentFreezedBalance - auctionPrice)
8282 if ((a > 0))
8383 then a
8484 else throw("Freezed amount couldn't be less than 0")
8585 }
8686
8787
8888 func freelancerIsRegistered (callerPub) = {
8989 let freelancerIsRegistered = getString(this, (callerPub + "_Freelancer"))
9090 match freelancerIsRegistered {
9191 case a: String =>
9292 callerPub
9393 case _ =>
9494 throw("Only registered users can make bets")
9595 }
9696 }
9797
9898
9999 func createAuctionPriceCheck (pmtAmount) = if ((pmtAmount > 0))
100100 then pmtAmount
101101 else throw("Amount must be higher then 0")
102102
103103
104104 func getAuctionState (auctionId) = {
105105 let valueState = getString(this, (auctionId + "_State"))
106106 match valueState {
107107 case a: String =>
108108 a
109109 case _ =>
110110 throw("Auction State was not found")
111111 }
112112 }
113113
114114
115115 func getAuctionClientPub (auctionId) = {
116- let valueClient = getString(this, (auctionId + "_Client"))
116+ let valueClient = getString(this, (auctionId + "_AuctionClient"))
117117 let a = match valueClient {
118118 case a: String =>
119119 a
120120 case _ =>
121121 throw("Auction Client was not found")
122122 }
123123 fromBase58String(a)
124124 }
125125
126126
127127 func getAuctionStartTime (auctionId) = {
128128 let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
129129 match valueAuctionStart {
130130 case a: Int =>
131131 a
132132 case _ =>
133133 throw("Auction Start time was not found")
134134 }
135135 }
136136
137137
138138 func getAuctionDurationTime (auctionId) = {
139139 let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
140140 match valueauctionDuration {
141141 case a: Int =>
142142 a
143143 case _ =>
144144 throw("Auction duration time was not found")
145145 }
146146 }
147147
148148
149149 func getAuctionJobPerformanceTime (auctionId) = {
150150 let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
151151 match valueBlocksForExecution {
152152 case a: Int =>
153153 a
154154 case _ =>
155155 throw("Auction job performance time was not found")
156156 }
157157 }
158158
159159
160160 func getAuctionAssetName (auctionId) = {
161161 let valueAssetName = getString(this, (auctionId + "_AssetName"))
162162 match valueAssetName {
163163 case a: String =>
164164 a
165165 case _ =>
166166 throw("Auction asset name was not found")
167167 }
168168 }
169169
170170
171171 func getAuctionPrice (auctionId) = {
172172 let valuePrice = getInteger(this, (auctionId + "_Price"))
173173 match valuePrice {
174174 case a: Int =>
175175 a
176176 case _ =>
177177 throw("Auction price was not found")
178178 }
179179 }
180180
181181
182182 func getAuctionFreelancerPub (auctionId) = {
183183 let valueClient = getString(this, (auctionId + "_HiredFreelancer"))
184184 let a = match valueClient {
185185 case a: String =>
186186 a
187187 case _ =>
188188 throw("Auction Client was not found")
189189 }
190190 fromBase58String(a)
191191 }
192192
193193
194194 @Callable(i)
195195 func freelancerSignUp (info) = {
196196 let userPublicKey = toBase58String(i.callerPublicKey)
197197 let alreadyRegistered = getString(this, (userPublicKey + "_Freelancer"))
198198 if (isDefined(alreadyRegistered))
199199 then throw("User already registered")
200200 else WriteSet([DataEntry((userPublicKey + "_Freelancer"), info)])
201201 }
202202
203203
204204
205205 @Callable(i)
206206 func clientSignUp (info) = {
207207 let userPublicKey = toBase58String(i.callerPublicKey)
208208 let alreadyRegistered = getString(this, (userPublicKey + "_Client"))
209209 if (isDefined(alreadyRegistered))
210210 then throw("User already registered")
211211 else WriteSet([DataEntry((userPublicKey + "_Client"), info)])
212212 }
213213
214214
215215
216216 @Callable(i)
217217 func createAuction (jobExecutionDays,auctionDurationDays,auctionInfo) = {
218218 let auctionId = toBase58String(i.transactionId)
219219 let auctionClient = toBase58String(i.callerPublicKey)
220220 let pmt = extract(i.payment)
221221 let pmtAmount = pmt.amount
222222 let auctionPrice = createAuctionPriceCheck(pmtAmount)
223223 let auctionStart = height
224224 let auctionDurationBlocks = (auctionDurationDays * day)
225225 let blocksForExecution = (jobExecutionDays * day)
226226 let pmtAssetName = if (!(isDefined(pmt.assetId)))
227227 then "WAVES"
228228 else if ((pmt.assetId == wBTC))
229229 then "BTC"
230230 else if ((pmt.assetId == wEUR))
231231 then "EUR"
232232 else if ((pmt.assetId == wUSD))
233233 then "USD"
234234 else throw("AssetId is incorrect")
235235 let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
236- WriteSet([DataEntry((auctionId + "_State"), stateOpen), DataEntry((auctionId + "_Info"), auctionInfo), DataEntry((auctionId + "_Client"), auctionClient), DataEntry((auctionId + "_AuctionStart"), auctionStart), DataEntry((auctionId + "_AuctionDuration"), auctionDurationBlocks), DataEntry((auctionId + "_JobPerformance"), blocksForExecution), DataEntry((auctionId + "_AssetName"), pmtAssetName), DataEntry((auctionId + "_Price"), auctionPrice), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
236+ WriteSet([DataEntry((auctionId + "_State"), stateOpen), DataEntry((auctionId + "_Info"), auctionInfo), DataEntry((auctionId + "_AuctionClient"), auctionClient), DataEntry((auctionId + "_AuctionStart"), auctionStart), DataEntry((auctionId + "_AuctionDuration"), auctionDurationBlocks), DataEntry((auctionId + "_JobPerformance"), blocksForExecution), DataEntry((auctionId + "_AssetName"), pmtAssetName), DataEntry((auctionId + "_Price"), auctionPrice), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
237237 }
238238
239239
240240
241241 @Callable(i)
242242 func makeBid (auctionId,betPrice) = {
243243 let callerPub = toBase58String(i.callerPublicKey)
244244 let betTime = height
245245 let auctionState = getAuctionState(auctionId)
246246 let auctionClient = getAuctionClientPub(auctionId)
247247 let auctionStart = getAuctionStartTime(auctionId)
248248 let auctionDuration = getAuctionDurationTime(auctionId)
249249 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
250250 let auctionAssetName = getAuctionAssetName(auctionId)
251251 let auctionPrice = getAuctionPrice(auctionId)
252252 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
253253 let newFreelancer = freelancerIsRegistered(callerPub)
254254 let dAppCommission = ((auctionPrice * 3) / 100)
255255 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
256256 let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
257257 if (auctionTimeisOver)
258258 then if ((auctionState == stateOpen))
259259 then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
260260 else if ((auctionState == stateSuggested))
261261 then {
262262 let auctionLowestBidder = {
263263 let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
264264 match valueLowestBidder {
265265 case a: String =>
266266 a
267267 case _ =>
268268 throw("Auction lowest bidder was not found")
269269 }
270270 }
271271 let newAuctionPrice = {
272272 let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
273273 match valueNewAuctionPrice {
274274 case a: Int =>
275275 a
276276 case _ =>
277277 throw("Auction lowest bid was not found")
278278 }
279279 }
280280 let amountDifference = ((auctionPrice - newAuctionPrice) - dAppCommission)
281281 ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
282282 }
283283 else throw("Incorrect auction state")
284284 else if ((auctionState == stateOpen))
285285 then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub)])
286286 else if ((auctionState == stateSuggested))
287287 then {
288288 let currentLowestBidderPub = {
289289 let lowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
290290 match lowestBidder {
291291 case a: String =>
292292 a
293293 case _ =>
294294 throw("Auction lowest bidder was not found")
295295 }
296296 }
297297 let newLowestBidderPub = {
298298 let valueCurrentLowestBid = getInteger(this, ((auctionId + "_Bid_") + currentLowestBidderPub))
299299 let currentLowestBid = match valueCurrentLowestBid {
300300 case a: Int =>
301301 a
302302 case _ =>
303303 throw("Auction lowest bid was not found")
304304 }
305305 if ((currentLowestBid > betPrice))
306306 then newFreelancer
307307 else currentLowestBidderPub
308308 }
309309 WriteSet([DataEntry((auctionId + "_LowestBidderPub"), newLowestBidderPub), DataEntry(((auctionId + "_Bid_") + newFreelancer), betPrice)])
310310 }
311311 else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested))
312312 }
313313
314314
315315
316316 @Callable(i)
317317 func chooseFreelancer (auctionId,freelancerPub) = {
318318 let callerPub = extract(i.callerPublicKey)
319319 let betTime = height
320320 let auctionState = getAuctionState(auctionId)
321321 let auctionClient = getAuctionClientPub(auctionId)
322322 let auctionStart = getAuctionStartTime(auctionId)
323323 let auctionDuration = getAuctionDurationTime(auctionId)
324324 let auctionAssetName = getAuctionAssetName(auctionId)
325325 let auctionPrice = getAuctionPrice(auctionId)
326326 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
327327 let freelancerBidAmount = {
328328 let keyFreelancerBid = ((auctionId + "_Bid_") + freelancerPub)
329329 let valueFreelacerBid = getInteger(this, keyFreelancerBid)
330330 match valueFreelacerBid {
331331 case a: Int =>
332332 a
333333 case _ =>
334334 throw("Freelancer's bet was not found")
335335 }
336336 }
337337 let dAppCommission = ((freelancerBidAmount * 3) / 100)
338338 let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
339339 if ((callerPub == auctionClient))
340340 then if (auctionTimeisOver)
341341 then if ((auctionState == stateOpen))
342342 then {
343343 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
344344 ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
345345 }
346346 else if ((auctionState == stateSuggested))
347347 then {
348348 let auctionLowestBidder = {
349349 let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
350350 match valueLowestBidder {
351351 case a: String =>
352352 a
353353 case _ =>
354354 throw("Auction lowest bidder was not found")
355355 }
356356 }
357357 let newAuctionPrice = {
358358 let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
359359 match valueNewAuctionPrice {
360360 case a: Int =>
361361 a
362362 case _ =>
363363 throw("Auction lowest bid was not found")
364364 }
365365 }
366366 let amountDifference = (auctionPrice - newAuctionPrice)
367367 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
368368 ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
369369 }
370370 else throw("Incorrect auction state")
371371 else {
372372 let setNewFreelancer = {
373373 let newFreelancer = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
374374 match newFreelancer {
375375 case a: Int =>
376376 freelancerPub
377377 case _ =>
378378 throw("Error: Incorrect freelancerPub")
379379 }
380380 }
381381 let newAuctionPrice = {
382382 let freelancerBid = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
383383 match freelancerBid {
384384 case a: Int =>
385385 a
386386 case _ =>
387387 throw("Auction lowest bidder was not found")
388388 }
389389 }
390390 let amountDifference = (auctionPrice - freelancerBidAmount)
391391 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
392392 ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (amountDifference - dAppCommission), auctionAssetId58)]))
393393 }
394394 else throw("Only auction customer can choose a freelancer")
395395 }
396396
397397
398398
399399 @Callable(i)
400400 func increaseExecutionTime (auctionId,executionDays) = {
401401 let caller = extract(i.callerPublicKey)
402402 let auctionState = getAuctionState(auctionId)
403403 let auctionClient = getAuctionClientPub(auctionId)
404404 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
405405 let newAuctionExecutionTime = {
406406 let newAuctionBlocksForExecution = (executionDays * day)
407407 if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
408408 then newAuctionBlocksForExecution
409409 else throw("New execution time must more than current execution time")
410410 }
411411 if ((caller == auctionClient))
412412 then if (if (if ((auctionState == stateOpen))
413413 then true
414414 else (auctionState == stateSuggested))
415415 then true
416416 else (auctionState == stateInProgress))
417417 then WriteSet([DataEntry((auctionId + "_JobPerformance"), newAuctionExecutionTime)])
418418 else throw("Incorrect state")
419419 else throw("Only Client can increase execution time")
420420 }
421421
422422
423423
424424 @Callable(i)
425425 func cancelAuction (auctionId) = {
426426 let callerPub = extract(i.callerPublicKey)
427427 let auctionState = getAuctionState(auctionId)
428428 let auctionClient = getAuctionClientPub(auctionId)
429429 let auctionAssetName = getAuctionAssetName(auctionId)
430430 let auctionPrice = getAuctionPrice(auctionId)
431431 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
432432 let dAppCommission = ((auctionPrice * 3) / 100)
433433 let amountWithoutComm = (auctionPrice - dAppCommission)
434434 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
435435 let callerIsClient = if ((callerPub == auctionClient))
436436 then true
437437 else throw("Auction can be canceled only by auction owner.")
438438 if (callerIsClient)
439439 then if ((auctionState == stateOpen))
440440 then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountWithoutComm, auctionAssetId58)]))
441441 else throw("Incorrect auction state.")
442442 else throw("Only Client can cancel auction")
443443 }
444444
445445
446446
447447 @Callable(i)
448448 func openDispute (auctionId) = {
449449 let caller = extract(i.callerPublicKey)
450450 let auctionState = getAuctionState(auctionId)
451451 let auctionClient = getAuctionClientPub(auctionId)
452452 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
453453 if (if ((auctionState == stateOpen))
454454 then true
455455 else (auctionState == stateSuggested))
456456 then throw("Incorrect auction state for dispute opening")
457457 else if (if ((caller == auctionClient))
458458 then true
459459 else (caller == auctionFreelancer))
460460 then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), 0)])
461461 else throw("Only customer and freelancer can open dispute")
462462 }
463463
464464
465465
466466 @Callable(i)
467467 func voteDispute (auctionId,vote) = {
468468 let callerPub = extract(i.callerPublicKey)
469469 let auctionState = getAuctionState(auctionId)
470470 let auctionClient = getAuctionClientPub(auctionId)
471471 let auctionAssetName = getAuctionAssetName(auctionId)
472472 let auctionPrice = getAuctionPrice(auctionId)
473473 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
474474 let comission = ((auctionPrice * 3) / 100)
475475 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
476476 let callerIsAmbassador = if (if (if (if (if ((callerPub == ambassador1))
477477 then true
478478 else (callerPub == ambassador2))
479479 then true
480480 else (callerPub == ambassador3))
481481 then true
482482 else (callerPub == ambassador4))
483483 then true
484484 else (callerPub == ambassador5))
485485 then toBase58String(callerPub)
486486 else throw("Only defined ambassadors can vote in disputes")
487487 let newVote = if (if ((vote == client))
488488 then true
489489 else (vote == freelancer))
490490 then vote
491491 else throw(((("Vote is incorrect. Must be: " + client) + " or ") + freelancer))
492492 let newVoter = {
493493 let keyVoter = ((auctionId + "_DiputeVote_") + callerIsAmbassador)
494494 let valueVoter = getString(this, keyVoter)
495495 match valueVoter {
496496 case a: String =>
497497 throw("User already voted")
498498 case _ =>
499499 callerIsAmbassador
500500 }
501501 }
502502 let votesNumber = {
503503 let valueVotesNumber = getInteger(this, (auctionId + "_DisputeVotes"))
504504 match valueVotesNumber {
505505 case a: Int =>
506506 a
507507 case _ =>
508508 throw("VotesNumber was not found")
509509 }
510510 }
511511 if ((auctionState == stateDispute))
512512 then if ((votesNumber == 4))
513513 then {
514514 let disputeWinner = {
515515 let ambassador1Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador1)))
516516 let ambassador2Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador2)))
517517 let ambassador3Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador3)))
518518 let ambassador4Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador4)))
519519 let ambassador5Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador5)))
520520 let v1 = if ((ambassador1Vote == client))
521521 then 1
522522 else 0
523523 let v2 = if ((ambassador2Vote == client))
524524 then 1
525525 else 0
526526 let v3 = if ((ambassador3Vote == client))
527527 then 1
528528 else 0
529529 let v4 = if ((ambassador4Vote == client))
530530 then 1
531531 else 0
532532 let v5 = if ((ambassador5Vote == client))
533533 then 1
534534 else 0
535535 let currentVote = if ((newVote == client))
536536 then 1
537537 else 0
538538 let votesForClient = (((((v1 + v2) + v3) + v4) + v5) + currentVote)
539539 if ((votesForClient > 2))
540540 then auctionClient
541541 else auctionFreelancer
542542 }
543543 let paymentWithoutComm = if ((disputeWinner == auctionClient))
544544 then auctionPrice
545545 else (auctionPrice - comission)
546546 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
547547 ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + callerIsAmbassador), newVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(disputeWinner), paymentWithoutComm, auctionAssetId58)]))
548548 }
549549 else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + callerIsAmbassador), newVote)])
550550 else throw(("Incorrect state. Must be: " + stateDispute))
551551 }
552552
553553
554554
555555 @Callable(i)
556556 func workHandOver (auctionId) = {
557557 let callerPub = extract(i.callerPublicKey)
558558 let auctionState = getAuctionState(auctionId)
559559 let auctionStart = getAuctionStartTime(auctionId)
560560 let auctionDuration = getAuctionDurationTime(auctionId)
561561 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
562562 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
563563 let currentTime = height
564564 let freelancerPubCheck = if ((callerPub == auctionFreelancer))
565565 then callerPub
566566 else throw("Only a freelancer can indicate that the work is done")
567567 let timeIsOver = ((currentTime - auctionStart) > auctionBlocksForExecution)
568568 if ((auctionState == stateInProgress))
569569 then if (timeIsOver)
570570 then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0")])
571571 else WriteSet([DataEntry((auctionId + "_State"), stateWait4Confirm)])
572572 else throw("Auction state is incorrect")
573573 }
574574
575575
576576
577577 @Callable(i)
578578 func acceptWork (auctionId) = {
579579 let callerPub = extract(i.callerPublicKey)
580580 let auctionState = getAuctionState(auctionId)
581581 let auctionClient = getAuctionClientPub(auctionId)
582582 let auctionStart = getAuctionStartTime(auctionId)
583583 let auctionDuration = getAuctionDurationTime(auctionId)
584584 let auctionAssetName = getAuctionAssetName(auctionId)
585585 let auctionPrice = getAuctionPrice(auctionId)
586586 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
587587 let dAppCommission = ((auctionPrice * 3) / 100)
588588 let amountWithoutComm = (auctionPrice - dAppCommission)
589589 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
590590 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
591591 let newRating = {
592592 let valueRating = getInteger(this, (toBase58String(auctionFreelancer) + "_Rating"))
593593 let currentRating = match valueRating {
594594 case a: Int =>
595595 a
596596 case _ =>
597597 0
598598 }
599599 (currentRating + 1)
600600 }
601601 if ((callerPub == auctionClient))
602602 then if ((auctionState == stateWait4Confirm))
603603 then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
604604 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
605605 else throw("Only auction customer can use this function")
606606 }
607607
608608
609609 @Verifier(tx)
610610 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
611611 then match tx {
612612 case ttx: TransferTransaction =>
613613 true
614614 case stx: SetScriptTransaction =>
615615 true
616616 case _ =>
617617 false
618618 }
619619 else false
620620

github/deemru/w8io/026f985 
76.95 ms