tx · 59JRXajgPL2a7ZCqxiKBRmfTaAfXNV539Acg4N1qWgGH

3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2:  -0.01500000 Waves

2019.10.14 13:48 [719504] smart account 3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2 > SELF 0.00000000 Waves

{ "type": 13, "id": "59JRXajgPL2a7ZCqxiKBRmfTaAfXNV539Acg4N1qWgGH", "fee": 1500000, "feeAssetId": null, "timestamp": 1571050088414, "version": 1, "sender": "3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2", "senderPublicKey": "8y2Uc9uYf5gRD6Dzm1aC73zYe3LZvtVDUVAnAhNdN2mg", "proofs": [ "bA4wdF2TFZhNG7Ux1mFSMHYCajm9ai6aMLkP7riJXhbgf3T75336NsxGdHGqEbt1onqkDNrME44Eemf6BbKyrGX" ], "script": "base64:AAIDAAAAAAAAAD8IARIDCgEIEgMKAQgSBQoDAQEIEgQKAggBEgQKAggIEgQKAggBEgMKAQgSAwoBCBIECgIICBIDCgEIEgMKAQgAAAAxAAAAAANkYXkAAAAAAAAABaAAAAAABVdBVkVTBQAAAAR1bml0AAAAAAR3QlRDAQAAACBs+mr/xe2qjAt/tSqT0qIML4KC23R6BIxT+/0TH3Og/wAAAAAEd0VVUgEAAAAg7BZhBF97kSFBBjs38+fX1Pjz08YOqoCX85C/0PoVupkAAAAABHdVU0QBAAAAIN0cvQHwz3UFMHgHsqi2OJjRRd1cH7ozWuNAb/pmWXD9AAAAAAlhdWN0VG9rZW4BAAAAAQAAAAAACXN0YXRlT3BlbgIAAAAGT3BlbmVkAAAAAA5zdGF0ZVN1Z2dlc3RlZAIAAAAJU3VnZ2VzdGVkAAAAAAtzdGF0ZUNhbmNlbAIAAAAIQ2FuY2VsZWQAAAAAD3N0YXRlSW5Qcm9ncmVzcwIAAAAKSW5Qcm9ncmVzcwAAAAARc3RhdGVXYWl0NENvbmZpcm0CAAAAE1dhaXRGb3JDb25maXJtYXRpb24AAAAADXN0YXRlQ29tcGxldGUCAAAACUNvbXBsZXRlZAAAAAAMc3RhdGVEaXNwdXRlAgAAAAdEaXNwdXRlAAAAABRzdGF0ZURpc3B1dGVSZXNvbHZlZAIAAAAPRGlzcHV0ZVJlc29sdmVkAAAAAAZjbGllbnQCAAAAAkNMAAAAAApmcmVlbGFuY2VyAgAAAAJGTAAAAAALYW1iYXNzYWRvcjECAAAALEZuZUNKcU01QlAyZUF1eXRlTWl1RUVIWUFMckU0YXhoRWZjcEhWR2JkcjVzAAAAAAthbWJhc3NhZG9yMgIAAAAsNlFBTWRzc2IxR0pqcFFWUVFjbng4ZktVOFdodGNGOVpzUWhpZmRUaEFFSzgAAAAAC2FtYmFzc2Fkb3IzAgAAACwyaXR1d1c3RFNSc0xQM1ZjYm5wcjk4UVVRTUdGUldLbXlZUEZxc1VLUkRvUAAAAAALYW1iYXNzYWRvcjQCAAAALEFOc1BRb2NFRVN5TGIzeVFxazJwd0Nkb0s3UEpReExvWlZwWXZzbTNTeFVHAAAAAAthbWJhc3NhZG9yNQIAAAAsMTNWaXh3UWluMU16WkN5WTY5TlNXTVNCTkVWMjdSemMxNTlvN3VaWFI5VlMBAAAABmdldEludAAAAAEAAAADa2V5BAAAABB2YWx1ZUpvYnNPbkdvaW5nCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQQAAAAHJG1hdGNoMAUAAAAQdmFsdWVKb2JzT25Hb2luZwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAABJBc3NldElkVG9Bc3NldE5hbWUAAAABAAAACnBtdEFzc2V0SWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAAApwbXRBc3NldElkAgAAAAVXQVZFUwMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAEd0JUQwIAAAADQlRDAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAR3RVVSAgAAAANFVVIDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAABHdVU0QCAAAAA1VTRAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAJYXVjdFRva2VuAgAAAARBVUNUCQAAAgAAAAECAAAAFEFzc2V0SWQgaXMgaW5jb3JyZWN0AQAAABJBc3NldE5hbWVUb0Fzc2V0SWQAAAABAAAAEGF1Y3Rpb25Bc3NldE5hbWUDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAABVdBVkVTBQAAAAVXQVZFUwMJAAAAAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAADQlRDBQAAAAR3QlRDAwkAAAAAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAANFVVIFAAAABHdFVVIDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAAA1VTRAUAAAAEd1VTRAMJAAAAAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAEQVVDVAUAAAAJYXVjdFRva2VuCQAAAgAAAAECAAAAEkluY29ycmVjdCBBc3NldCBJZAEAAAAJdGltZUNoZWNrAAAAAwAAAAtjdXJyZW50VGltZQAAAAlzdGFydFRpbWUAAAAOZXhwaXJhdGlvblRpbWUJAABmAAAAAgkAAGUAAAACBQAAAAtjdXJyZW50VGltZQUAAAAJc3RhcnRUaW1lBQAAAA5leHBpcmF0aW9uVGltZQEAAAAOYmlkQW1vdW50Q2hlY2sAAAACAAAABmFtb3VudAAAAAxhdWN0aW9uUHJpY2UDCQAAZgAAAAIFAAAABmFtb3VudAUAAAAMYXVjdGlvblByaWNlCQAAAgAAAAECAAAAM0JpZCBhbW91bnQgbXVzdCBiZSBsb3dlciBvciBlcXVhbCB0aGFuIGF1Y3Rpb25QcmljZQUAAAAGYW1vdW50AQAAABZpbmNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgAAAAxwbXRBc3NldE5hbWUAAAAMYXVjdGlvblByaWNlBAAAAA9rZXlGcmVlemVkRnVuZHMJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAxwbXRBc3NldE5hbWUCAAAACF9GcmVlemVkBAAAABVjdXJyZW50RnJlZXplZEJhbGFuY2UEAAAAByRtYXRjaDAFAAAAD2tleUZyZWV6ZWRGdW5kcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAACQAAZAAAAAIFAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQUAAAAMYXVjdGlvblByaWNlAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgAAAAxwbXRBc3NldE5hbWUAAAAMYXVjdGlvblByaWNlBAAAAA9rZXlGcmVlemVkRnVuZHMJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAxwbXRBc3NldE5hbWUCAAAACF9GcmVlemVkBAAAABVjdXJyZW50RnJlZXplZEJhbGFuY2UEAAAAByRtYXRjaDAFAAAAD2tleUZyZWV6ZWRGdW5kcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAABAAAAAFhCQAAZQAAAAIFAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQUAAAAMYXVjdGlvblByaWNlAwkAAGcAAAACBQAAAAFhAAAAAAAAAAAABQAAAAFhCQAAAgAAAAECAAAAJkZyZWV6ZWQgYW1vdW50IGNvdWxkbid0IGJlIGxlc3MgdGhhbiAwAQAAABBjbGllbnRSZWdpc3RlcmVkAAAAAQAAAAljYWxsZXJQdWIEAAAAFmZyZWVsYW5jZXJJc1JlZ2lzdGVyZWQJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAljYWxsZXJQdWICAAAAC19GcmVlbGFuY2VyBAAAAAckbWF0Y2gwBQAAABZmcmVlbGFuY2VySXNSZWdpc3RlcmVkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAACWNhbGxlclB1YgkAAAIAAAABAgAAACNPbmx5IHJlZ2lzdGVyZWQgdXNlcnMgY2FuIG1ha2UgYmV0cwEAAAAUZnJlZWxhbmNlclJlZ2lzdGVyZWQAAAABAAAACWNhbGxlclB1YgQAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWNhbGxlclB1YgIAAAALX0ZyZWVsYW5jZXIEAAAAByRtYXRjaDAFAAAAFmZyZWVsYW5jZXJJc1JlZ2lzdGVyZWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAAJY2FsbGVyUHViCQAAAgAAAAECAAAAI09ubHkgcmVnaXN0ZXJlZCB1c2VycyBjYW4gbWFrZSBiZXRzAQAAABdjcmVhdGVBdWN0aW9uUHJpY2VDaGVjawAAAAEAAAAJcG10QW1vdW50AwkAAGYAAAACBQAAAAlwbXRBbW91bnQAAAAAAAAAAAAFAAAACXBtdEFtb3VudAkAAAIAAAABAgAAABxBbW91bnQgbXVzdCBiZSBoaWdoZXIgdGhlbiAwAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABAAAACWF1Y3Rpb25JZAQAAAAKdmFsdWVTdGF0ZQkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBAAAAAckbWF0Y2gwBQAAAAp2YWx1ZVN0YXRlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAbQXVjdGlvbiBTdGF0ZSB3YXMgbm90IGZvdW5kAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQAAAAlhdWN0aW9uSWQEAAAADnZhbHVlQ2xpZW50UHViCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA5fQXVjdGlvbkNsaWVudAQAAAAHJG1hdGNoMAUAAAAOdmFsdWVDbGllbnRQdWIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABxBdWN0aW9uIENsaWVudCB3YXMgbm90IGZvdW5kAQAAABNnZXRBdWN0aW9uU3RhcnRUaW1lAAAAAQAAAAlhdWN0aW9uSWQEAAAAEXZhbHVlQXVjdGlvblN0YXJ0CQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fQXVjdGlvblN0YXJ0BAAAAAckbWF0Y2gwBQAAABF2YWx1ZUF1Y3Rpb25TdGFydAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gU3RhcnQgdGltZSB3YXMgbm90IGZvdW5kAQAAABZnZXRBdWN0aW9uRHVyYXRpb25UaW1lAAAAAQAAAAlhdWN0aW9uSWQEAAAAFHZhbHVlYXVjdGlvbkR1cmF0aW9uCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfQXVjdGlvbkR1cmF0aW9uBAAAAAckbWF0Y2gwBQAAABR2YWx1ZWF1Y3Rpb25EdXJhdGlvbgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAI0F1Y3Rpb24gZHVyYXRpb24gdGltZSB3YXMgbm90IGZvdW5kAQAAABxnZXRBdWN0aW9uSm9iUGVyZm9ybWFuY2VUaW1lAAAAAQAAAAlhdWN0aW9uSWQEAAAAF3ZhbHVlQmxvY2tzRm9yRXhlY3V0aW9uCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA9fSm9iUGVyZm9ybWFuY2UEAAAAByRtYXRjaDAFAAAAF3ZhbHVlQmxvY2tzRm9yRXhlY3V0aW9uAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAqQXVjdGlvbiBqb2IgcGVyZm9ybWFuY2UgdGltZSB3YXMgbm90IGZvdW5kAQAAABNnZXRBdWN0aW9uQXNzZXROYW1lAAAAAQAAAAlhdWN0aW9uSWQEAAAADnZhbHVlQXNzZXROYW1lCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAApfQXNzZXROYW1lBAAAAAckbWF0Y2gwBQAAAA52YWx1ZUFzc2V0TmFtZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAIEF1Y3Rpb24gYXNzZXQgbmFtZSB3YXMgbm90IGZvdW5kAQAAAA9nZXRBdWN0aW9uUHJpY2UAAAABAAAACWF1Y3Rpb25JZAQAAAAKdmFsdWVQcmljZQkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1ByaWNlBAAAAAckbWF0Y2gwBQAAAAp2YWx1ZVByaWNlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAbQXVjdGlvbiBwcmljZSB3YXMgbm90IGZvdW5kAQAAABdnZXRBdWN0aW9uRnJlZWxhbmNlclB1YgAAAAEAAAAJYXVjdGlvbklkBAAAAAt2YWx1ZUNsaWVudAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0hpcmVkRnJlZWxhbmNlcgQAAAAHJG1hdGNoMAUAAAALdmFsdWVDbGllbnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABxBdWN0aW9uIENsaWVudCB3YXMgbm90IGZvdW5kAQAAABZnZXRBdWN0aW9uTG93ZXN0QmlkZGVyAAAAAQAAAAlhdWN0aW9uSWQEAAAAEXZhbHVlTG93ZXN0QmlkZGVyCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBAAAAAckbWF0Y2gwBQAAABF2YWx1ZUxvd2VzdEJpZGRlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAI0F1Y3Rpb24gbG93ZXN0IGJpZGRlciB3YXMgbm90IGZvdW5kAQAAAAZnZXRCaWQAAAACAAAACWF1Y3Rpb25JZAAAABNhdWN0aW9uTG93ZXN0QmlkZGVyBAAAABR2YWx1ZU5ld0F1Y3Rpb25QcmljZQkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAVfQmlkXwUAAAATYXVjdGlvbkxvd2VzdEJpZGRlcgQAAAAHJG1hdGNoMAUAAAAUdmFsdWVOZXdBdWN0aW9uUHJpY2UDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACBBdWN0aW9uIGxvd2VzdCBiaWQgd2FzIG5vdCBmb3VuZAEAAAAVZGVmaW5lTmV3TG93ZXN0QmlkZGVyAAAABAAAAAlhdWN0aW9uSWQAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgAAAAliaWRBbW91bnQAAAANbmV3RnJlZWxhbmNlcgQAAAAVdmFsdWVDdXJyZW50TG93ZXN0QmlkCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9CaWRfBQAAABZjdXJyZW50TG93ZXN0QmlkZGVyUHViBAAAABBjdXJyZW50TG93ZXN0QmlkBAAAAAckbWF0Y2gwBQAAABV2YWx1ZUN1cnJlbnRMb3dlc3RCaWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACBBdWN0aW9uIGxvd2VzdCBiaWQgd2FzIG5vdCBmb3VuZAMJAABmAAAAAgUAAAAQY3VycmVudExvd2VzdEJpZAUAAAAJYmlkQW1vdW50BQAAAA1uZXdGcmVlbGFuY2VyBQAAABZjdXJyZW50TG93ZXN0QmlkZGVyUHViAQAAABZjaG9vc2VkRnJlZWxhbmNlckNoZWNrAAAAAgAAAAlhdWN0aW9uSWQAAAANZnJlZWxhbmNlclB1YgQAAAANbmV3RnJlZWxhbmNlcgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAVfQmlkXwUAAAANZnJlZWxhbmNlclB1YgQAAAAHJG1hdGNoMAUAAAANbmV3RnJlZWxhbmNlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAA1mcmVlbGFuY2VyUHViCQAAAgAAAAECAAAAHkVycm9yOiBJbmNvcnJlY3QgZnJlZWxhbmNlclB1YgEAAAAVbmV3RXhlY3V0aW9uVGltZUNoZWNrAAAAAgAAAA1leGVjdXRpb25EYXlzAAAAGWF1Y3Rpb25CbG9ja3NGb3JFeGVjdXRpb24EAAAAHG5ld0F1Y3Rpb25CbG9ja3NGb3JFeGVjdXRpb24JAABoAAAAAgUAAAANZXhlY3V0aW9uRGF5cwUAAAADZGF5AwkAAGYAAAACBQAAABxuZXdBdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uBQAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uBQAAABxuZXdBdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQAAAgAAAAECAAAAOE5ldyBleGVjdXRpb24gdGltZSBtdXN0IG1vcmUgdGhhbiBjdXJyZW50IGV4ZWN1dGlvbiB0aW1lAQAAAAlnZXRSYXRpbmcAAAABAAAAEWF1Y3Rpb25GcmVlbGFuY2VyBAAAAAt2YWx1ZVJhdGluZwkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyAgAAAAdfUmF0aW5nBAAAAAckbWF0Y2gwBQAAAAt2YWx1ZVJhdGluZwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAABJjYWxsZXJJc0FtYmFzc2Fkb3IAAAABAAAACWNhbGxlclB1YgMDAwMDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAALYW1iYXNzYWRvcjEGCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAALYW1iYXNzYWRvcjIGCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAALYW1iYXNzYWRvcjMGCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAALYW1iYXNzYWRvcjQGCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAALYW1iYXNzYWRvcjUFAAAACWNhbGxlclB1YgkAAAIAAAABAgAAAC1Pbmx5IGRlZmluZWQgYW1iYXNzYWRvcnMgY2FuIHZvdGUgaW4gZGlzcHV0ZXMBAAAAE2FtYmFzc2Fkb3JWb3RlQ2hlY2sAAAADAAAACWF1Y3Rpb25JZAAAAA1hbWJhc3NhZG9yUHViAAAABHZvdGUEAAAACGtleVZvdGVyCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAxfRGlwdXRlVm90ZV8FAAAADWFtYmFzc2Fkb3JQdWIEAAAACnZhbHVlVm90ZXIJAAQdAAAAAgUAAAAEdGhpcwUAAAAIa2V5Vm90ZXIEAAAAD2FtYmFzc2Fkb3JWb3RlZAQAAAAHJG1hdGNoMAUAAAAKdmFsdWVWb3RlcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBgcDBQAAAA9hbWJhc3NhZG9yVm90ZWQJAAACAAAAAQIAAAAZQW1iYXNzYWRvciB2b3RlZCBhbHJlYWR5IAMDCQAAAAAAAAIFAAAABHZvdGUFAAAABmNsaWVudAYJAAAAAAAAAgUAAAAEdm90ZQUAAAAKZnJlZWxhbmNlcgUAAAAEdm90ZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABxWb3RlIGlzIGluY29ycmVjdC4gTXVzdCBiZTogBQAAAAZjbGllbnQCAAAABCBvciAFAAAACmZyZWVsYW5jZXIBAAAADmdldFZvdGVzTnVtYmVyAAAAAQAAAAlhdWN0aW9uSWQEAAAAEHZhbHVlVm90ZXNOdW1iZXIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADV9EaXNwdXRlVm90ZXMEAAAAByRtYXRjaDAFAAAAEHZhbHVlVm90ZXNOdW1iZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABlWb3Rlc051bWJlciB3YXMgbm90IGZvdW5kAQAAABNkZWZpbmVEaXNwdXRlV2lubmVyAAAABAAAAAlhdWN0aW9uSWQAAAAHbmV3Vm90ZQAAAA1hdWN0aW9uQ2xpZW50AAAAEWF1Y3Rpb25GcmVlbGFuY2VyBAAAAA9hbWJhc3NhZG9yMVZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfBQAAAAthbWJhc3NhZG9yMQQAAAAPYW1iYXNzYWRvcjJWb3RlCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9EaXB1dGVWb3RlXwUAAAALYW1iYXNzYWRvcjIEAAAAD2FtYmFzc2Fkb3IzVm90ZQkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAxfRGlwdXRlVm90ZV8FAAAAC2FtYmFzc2Fkb3IzBAAAAA9hbWJhc3NhZG9yNFZvdGUJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfBQAAAAthbWJhc3NhZG9yNAQAAAAPYW1iYXNzYWRvcjVWb3RlCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADF9EaXB1dGVWb3RlXwUAAAALYW1iYXNzYWRvcjUEAAAAAnYxAwkAAAAAAAACBQAAAA9hbWJhc3NhZG9yMVZvdGUFAAAABmNsaWVudAAAAAAAAAAAAQAAAAAAAAAAAAQAAAACdjIDCQAAAAAAAAIFAAAAD2FtYmFzc2Fkb3IyVm90ZQUAAAAGY2xpZW50AAAAAAAAAAABAAAAAAAAAAAABAAAAAJ2MwMJAAAAAAAAAgUAAAAPYW1iYXNzYWRvcjNWb3RlBQAAAAZjbGllbnQAAAAAAAAAAAEAAAAAAAAAAAAEAAAAAnY0AwkAAAAAAAACBQAAAA9hbWJhc3NhZG9yNFZvdGUFAAAABmNsaWVudAAAAAAAAAAAAQAAAAAAAAAAAAQAAAACdjUDCQAAAAAAAAIFAAAAD2FtYmFzc2Fkb3I1Vm90ZQUAAAAGY2xpZW50AAAAAAAAAAABAAAAAAAAAAAABAAAAAtjdXJyZW50Vm90ZQMJAAAAAAAAAgUAAAAHbmV3Vm90ZQUAAAAGY2xpZW50AAAAAAAAAAABAAAAAAAAAAAABAAAAA52b3Rlc0ZvckNsaWVudAkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIFAAAAAnYxBQAAAAJ2MgUAAAACdjMFAAAAAnY0BQAAAAJ2NQUAAAALY3VycmVudFZvdGUDCQAAZgAAAAIFAAAADnZvdGVzRm9yQ2xpZW50AAAAAAAAAAACBQAAAA1hdWN0aW9uQ2xpZW50BQAAABFhdWN0aW9uRnJlZWxhbmNlcgAAAAsAAAABaQEAAAAQZnJlZWxhbmNlclNpZ25VcAAAAAEAAAAEaW5mbwQAAAANdXNlclB1YmxpY0tleQkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX0ZyZWVsYW5jZXIDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAACAAAAAQIAAAAXVXNlciBhbHJlYWR5IHJlZ2lzdGVyZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX0ZyZWVsYW5jZXIFAAAABGluZm8JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAAQX1BlbmRpbmdFYXJuaW5ncwAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA11c2VyUHVibGljS2V5AgAAAA1fUGFpZEVhcm5pbmdzAAAAAAAAAAAACQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAADl9Ub3RhbEVhcm5pbmdzAAAAAAAAAAAACQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAADF9Kb2JzUGVuZGluZwAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA11c2VyUHVibGljS2V5AgAAAA5fSm9ic0NvbXBsZXRlZAAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA11c2VyUHVibGljS2V5AgAAAApfSm9ic1RvdGFsAAAAAAAAAAAABQAAAANuaWwAAAABaQEAAAAMY2xpZW50U2lnblVwAAAAAQAAAARpbmZvBAAAAA11c2VyUHVibGljS2V5CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAA11c2VyUHVibGljS2V5AgAAAAdfQ2xpZW50AwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAAAgAAAAECAAAAF1VzZXIgYWxyZWFkeSByZWdpc3RlcmVkCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAAB19DbGllbnQFAAAABGluZm8JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAAMX0pvYnNDcmVhdGVkAAAAAAAAAAAACQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAADF9Kb2JzT25Hb2luZwAAAAAAAAAAAAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA11c2VyUHVibGljS2V5AgAAAA1fSm9iSW5EaXNwdXRlAAAAAAAAAAAABQAAAANuaWwAAAABaQEAAAANY3JlYXRlQXVjdGlvbgAAAAMAAAAQam9iRXhlY3V0aW9uRGF5cwAAABNhdWN0aW9uRHVyYXRpb25EYXlzAAAAC2F1Y3Rpb25JbmZvBAAAAAljYWxsZXJQdWIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAlhdWN0aW9uSWQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAQAAAANYXVjdGlvbkNsaWVudAkBAAAAEGNsaWVudFJlZ2lzdGVyZWQAAAABBQAAAAljYWxsZXJQdWIEAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAAlwbXRBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50BAAAAAxhdWN0aW9uUHJpY2UJAQAAABdjcmVhdGVBdWN0aW9uUHJpY2VDaGVjawAAAAEFAAAACXBtdEFtb3VudAQAAAAMYXVjdGlvblN0YXJ0BQAAAAZoZWlnaHQEAAAAFWF1Y3Rpb25EdXJhdGlvbkJsb2NrcwkAAGgAAAACBQAAABNhdWN0aW9uRHVyYXRpb25EYXlzBQAAAANkYXkEAAAAEmJsb2Nrc0ZvckV4ZWN1dGlvbgkAAGgAAAACBQAAABBqb2JFeGVjdXRpb25EYXlzBQAAAANkYXkEAAAADHBtdEFzc2V0TmFtZQkBAAAAEkFzc2V0SWRUb0Fzc2V0TmFtZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAALam9ic0NyZWF0ZWQJAQAAAAZnZXRJbnQAAAABCQABLAAAAAIFAAAADWF1Y3Rpb25DbGllbnQCAAAADF9Kb2JzQ3JlYXRlZAQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZpbmNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAMcG10QXNzZXROYW1lBQAAAAxhdWN0aW9uUHJpY2UJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAACXN0YXRlT3BlbgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABV9JbmZvBQAAAAthdWN0aW9uSW5mbwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADl9BdWN0aW9uQ2xpZW50BQAAAA1hdWN0aW9uQ2xpZW50CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0F1Y3Rpb25TdGFydAUAAAAMYXVjdGlvblN0YXJ0CQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0F1Y3Rpb25EdXJhdGlvbgUAAAAVYXVjdGlvbkR1cmF0aW9uQmxvY2tzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAPX0pvYlBlcmZvcm1hbmNlBQAAABJibG9ja3NGb3JFeGVjdXRpb24JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAApfQXNzZXROYW1lBQAAAAxwbXRBc3NldE5hbWUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UFAAAADGF1Y3Rpb25QcmljZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAxwbXRBc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA1hdWN0aW9uQ2xpZW50AgAAAAxfSm9ic0NyZWF0ZWQJAABkAAAAAgUAAAALam9ic0NyZWF0ZWQAAAAAAAAAAAEFAAAAA25pbAAAAAFpAQAAAAdtYWtlQmlkAAAAAgAAAAlhdWN0aW9uSWQAAAAGYW1vdW50BAAAAAljYWxsZXJQdWIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAAAxhdWN0aW9uU3RhcnQJAQAAABNnZXRBdWN0aW9uU3RhcnRUaW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAAA9hdWN0aW9uRHVyYXRpb24JAQAAABZnZXRBdWN0aW9uRHVyYXRpb25UaW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQEAAAAcZ2V0QXVjdGlvbkpvYlBlcmZvcm1hbmNlVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0TmFtZQkBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25QcmljZQkBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0SWQ1OAkBAAAAEkFzc2V0TmFtZVRvQXNzZXRJZAAAAAEFAAAAEGF1Y3Rpb25Bc3NldE5hbWUEAAAADW5ld0ZyZWVsYW5jZXIJAQAAABRmcmVlbGFuY2VyUmVnaXN0ZXJlZAAAAAEFAAAACWNhbGxlclB1YgQAAAAOZEFwcENvbW1pc3Npb24JAABpAAAAAgkAAGgAAAACBQAAAAxhdWN0aW9uUHJpY2UAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQEAAAAWZGVjcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQQAAAAJYmlkQW1vdW50CQEAAAAOYmlkQW1vdW50Q2hlY2sAAAACBQAAAAZhbW91bnQFAAAADGF1Y3Rpb25QcmljZQQAAAARYXVjdGlvblRpbWVpc092ZXIJAQAAAAl0aW1lQ2hlY2sAAAADBQAAAAZoZWlnaHQFAAAADGF1Y3Rpb25TdGFydAUAAAAPYXVjdGlvbkR1cmF0aW9uAwUAAAARYXVjdGlvblRpbWVpc092ZXIDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAJc3RhdGVPcGVuCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAALc3RhdGVDYW5jZWwJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAA1hdWN0aW9uQ2xpZW50CQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAOZEFwcENvbW1pc3Npb24FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA5zdGF0ZVN1Z2dlc3RlZAQAAAATYXVjdGlvbkxvd2VzdEJpZGRlcgkBAAAAFmdldEF1Y3Rpb25Mb3dlc3RCaWRkZXIAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Mb3dlc3RCaWQJAQAAAAZnZXRCaWQAAAACBQAAAAlhdWN0aW9uSWQFAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIEAAAAEGFtb3VudERpZmZlcmVuY2UJAABlAAAAAgkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAAEGF1Y3Rpb25Mb3dlc3RCaWQFAAAADmRBcHBDb21taXNzaW9uCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0hpcmVkRnJlZWxhbmNlcgUAAAATYXVjdGlvbkxvd2VzdEJpZGRlcgkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9QcmljZQUAAAAQYXVjdGlvbkxvd2VzdEJpZAUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAANYXVjdGlvbkNsaWVudAUAAAAQYW1vdW50RGlmZmVyZW5jZQUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQAAAgAAAAECAAAAF0luY29ycmVjdCBhdWN0aW9uIHN0YXRlAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAFX0JpZF8FAAAADW5ld0ZyZWVsYW5jZXIFAAAACWJpZEFtb3VudAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAABBfTG93ZXN0QmlkZGVyUHViBQAAAAljYWxsZXJQdWIFAAAAA25pbAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA5zdGF0ZVN1Z2dlc3RlZAQAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgkBAAAAFmdldEF1Y3Rpb25Mb3dlc3RCaWRkZXIAAAABBQAAAAlhdWN0aW9uSWQEAAAAEm5ld0xvd2VzdEJpZGRlclB1YgkBAAAAFWRlZmluZU5ld0xvd2VzdEJpZGRlcgAAAAQFAAAACWF1Y3Rpb25JZAUAAAAWY3VycmVudExvd2VzdEJpZGRlclB1YgUAAAAJYmlkQW1vdW50BQAAAA1uZXdGcmVlbGFuY2VyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAQX0xvd2VzdEJpZGRlclB1YgUAAAASbmV3TG93ZXN0QmlkZGVyUHViCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAVfQmlkXwUAAAANbmV3RnJlZWxhbmNlcgUAAAAJYmlkQW1vdW50BQAAAANuaWwJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHEluY29ycmVjdCBqb2JJZCBzdGF0ZS4gTm93OiAFAAAADGF1Y3Rpb25TdGF0ZQIAAAALLCBtdXN0IGJlOiAFAAAACXN0YXRlT3BlbgIAAAAEIG9yIAUAAAAOc3RhdGVTdWdnZXN0ZWQAAAABaQEAAAAQY2hvb3NlRnJlZWxhbmNlcgAAAAIAAAAJYXVjdGlvbklkAAAADWZyZWVsYW5jZXJQdWIEAAAACWNhbGxlclB1YgkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAADGF1Y3Rpb25TdGF0ZQkBAAAAD2dldEF1Y3Rpb25TdGF0ZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAANYXVjdGlvbkNsaWVudAkBAAAAE2dldEF1Y3Rpb25DbGllbnRQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGFydAkBAAAAE2dldEF1Y3Rpb25TdGFydFRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAD2F1Y3Rpb25EdXJhdGlvbgkBAAAAFmdldEF1Y3Rpb25EdXJhdGlvblRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Bc3NldE5hbWUJAQAAABNnZXRBdWN0aW9uQXNzZXROYW1lAAAAAQUAAAAJYXVjdGlvbklkBAAAAAxhdWN0aW9uUHJpY2UJAQAAAA9nZXRBdWN0aW9uUHJpY2UAAAABBQAAAAlhdWN0aW9uSWQEAAAAEGF1Y3Rpb25Bc3NldElkNTgJAQAAABJBc3NldE5hbWVUb0Fzc2V0SWQAAAABBQAAABBhdWN0aW9uQXNzZXROYW1lBAAAAA1uZXdGcmVlbGFuY2VyCQEAAAAWY2hvb3NlZEZyZWVsYW5jZXJDaGVjawAAAAIFAAAACWF1Y3Rpb25JZAUAAAANZnJlZWxhbmNlclB1YgQAAAATZnJlZWxhbmNlckJpZEFtb3VudAkBAAAABmdldEJpZAAAAAIFAAAACWF1Y3Rpb25JZAUAAAANbmV3RnJlZWxhbmNlcgQAAAARYXVjdGlvblRpbWVpc092ZXIJAQAAAAl0aW1lQ2hlY2sAAAADBQAAAAZoZWlnaHQFAAAADGF1Y3Rpb25TdGFydAUAAAAPYXVjdGlvbkR1cmF0aW9uBAAAAAtqb2JzT25Hb2luZwkBAAAABmdldEludAAAAAEJAAEsAAAAAgUAAAANYXVjdGlvbkNsaWVudAIAAAAMX0pvYnNPbkdvaW5nBAAAABlmcmVlbGFuY2VyUGVuZGluZ0Vhcm5pbmdzCQEAAAAGZ2V0SW50AAAAAQkAASwAAAACBQAAAA1mcmVlbGFuY2VyUHViAgAAABBfUGVuZGluZ0Vhcm5pbmdzBAAAABdmcmVlbGFuY2VyVG90YWxFYXJuaW5ncwkBAAAABmdldEludAAAAAEJAAEsAAAAAgUAAAANZnJlZWxhbmNlclB1YgIAAAAOX1RvdGFsRWFybmluZ3MDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAANYXVjdGlvbkNsaWVudAMFAAAAEWF1Y3Rpb25UaW1laXNPdmVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAADGF1Y3Rpb25QcmljZQAAAAAAAAAAAwAAAAAAAAAAZAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAC3N0YXRlQ2FuY2VsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAANYXVjdGlvbkNsaWVudAkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAADmRBcHBDb21taXNzaW9uBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQEAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIJAQAAABZnZXRBdWN0aW9uTG93ZXN0QmlkZGVyAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uTG93ZXN0QmlkCQEAAAAGZ2V0QmlkAAAAAgUAAAAJYXVjdGlvbklkBQAAABNhdWN0aW9uTG93ZXN0QmlkZGVyBAAAABBhbW91bnREaWZmZXJlbmNlCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAQYXVjdGlvbkxvd2VzdEJpZAQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAQYW1vdW50RGlmZmVyZW5jZQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAD3N0YXRlSW5Qcm9ncmVzcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9IaXJlZEZyZWVsYW5jZXIFAAAAE2F1Y3Rpb25Mb3dlc3RCaWRkZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UFAAAAEGF1Y3Rpb25Mb3dlc3RCaWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADWF1Y3Rpb25DbGllbnQCAAAADF9Kb2JzT25Hb2luZwkAAGQAAAACBQAAAAtqb2JzT25Hb2luZwAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA1mcmVlbGFuY2VyUHViAgAAABBfUGVuZGluZ0Vhcm5pbmdzCQAAZAAAAAIFAAAAGWZyZWVsYW5jZXJQZW5kaW5nRWFybmluZ3MFAAAAEGF1Y3Rpb25Mb3dlc3RCaWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANZnJlZWxhbmNlclB1YgIAAAAOX1RvdGFsRWFybmluZ3MJAABkAAAAAgUAAAAXZnJlZWxhbmNlclRvdGFsRWFybmluZ3MFAAAAEGF1Y3Rpb25Mb3dlc3RCaWQFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQACWQAAAAEFAAAADWF1Y3Rpb25DbGllbnQFAAAAEGFtb3VudERpZmZlcmVuY2UFAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAABdJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZQMDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAJc3RhdGVPcGVuBgkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAADnN0YXRlU3VnZ2VzdGVkBAAAABBhbW91bnREaWZmZXJlbmNlCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAATZnJlZWxhbmNlckJpZEFtb3VudAQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAQYW1vdW50RGlmZmVyZW5jZQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAD3N0YXRlSW5Qcm9ncmVzcwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAEF9IaXJlZEZyZWVsYW5jZXIFAAAADW5ld0ZyZWVsYW5jZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfUHJpY2UFAAAAE2ZyZWVsYW5jZXJCaWRBbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAAIX0ZyZWV6ZWQFAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADWF1Y3Rpb25DbGllbnQCAAAADF9Kb2JzT25Hb2luZwkAAGQAAAACBQAAAAtqb2JzT25Hb2luZwAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA1mcmVlbGFuY2VyUHViAgAAABBfUGVuZGluZ0Vhcm5pbmdzCQAAZAAAAAIFAAAAGWZyZWVsYW5jZXJQZW5kaW5nRWFybmluZ3MFAAAAE2ZyZWVsYW5jZXJCaWRBbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANZnJlZWxhbmNlclB1YgIAAAAOX1RvdGFsRWFybmluZ3MJAABkAAAAAgUAAAAXZnJlZWxhbmNlclRvdGFsRWFybmluZ3MFAAAAE2ZyZWVsYW5jZXJCaWRBbW91bnQFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQACWQAAAAEFAAAADWF1Y3Rpb25DbGllbnQJAABkAAAAAgUAAAAQYW1vdW50RGlmZmVyZW5jZQAAAAAAAAAAAQUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQAAAgAAAAECAAAAF0luY29ycmVjdCBhdWN0aW9uIHN0YXRlCQAAAgAAAAECAAAALU9ubHkgYXVjdGlvbiBjdXN0b21lciBjYW4gY2hvb3NlIGEgZnJlZWxhbmNlcgAAAAFpAQAAABVpbmNyZWFzZUV4ZWN1dGlvblRpbWUAAAACAAAACWF1Y3Rpb25JZAAAAA1leGVjdXRpb25EYXlzBAAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQEAAAAcZ2V0QXVjdGlvbkpvYlBlcmZvcm1hbmNlVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAXbmV3QXVjdGlvbkV4ZWN1dGlvblRpbWUJAQAAABVuZXdFeGVjdXRpb25UaW1lQ2hlY2sAAAACBQAAAA1leGVjdXRpb25EYXlzBQAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uAwkAAAAAAAACBQAAAAZjYWxsZXIFAAAADWF1Y3Rpb25DbGllbnQDAwMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAlzdGF0ZU9wZW4GCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQGCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAPX0pvYlBlcmZvcm1hbmNlBQAAABduZXdBdWN0aW9uRXhlY3V0aW9uVGltZQUAAAADbmlsCQAAAgAAAAECAAAAD0luY29ycmVjdCBzdGF0ZQkAAAIAAAABAgAAACdPbmx5IENsaWVudCBjYW4gaW5jcmVhc2UgZXhlY3V0aW9uIHRpbWUAAAABaQEAAAANY2FuY2VsQXVjdGlvbgAAAAEAAAAJYXVjdGlvbklkBAAAAAljYWxsZXJQdWIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXROYW1lCQEAAAATZ2V0QXVjdGlvbkFzc2V0TmFtZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblByaWNlCQEAAAAPZ2V0QXVjdGlvblByaWNlAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAASQXNzZXROYW1lVG9Bc3NldElkAAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAAOZEFwcENvbW1pc3Npb24JAABpAAAAAgkAAGgAAAACBQAAAAxhdWN0aW9uUHJpY2UAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEWFtb3VudFdpdGhvdXRDb21tCQAAZQAAAAIFAAAADGF1Y3Rpb25QcmljZQUAAAAOZEFwcENvbW1pc3Npb24EAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQEAAAAWZGVjcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQMJAAAAAAAAAgUAAAAJY2FsbGVyUHViBQAAAA1hdWN0aW9uQ2xpZW50AwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAC3N0YXRlQ2FuY2VsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAANYXVjdGlvbkNsaWVudAUAAAARYW1vdW50V2l0aG91dENvbW0FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABAgAAAC5BdWN0aW9uIGNhbiBiZSBjYW5jZWxlZCBvbmx5IGJ5IGF1Y3Rpb24gb3duZXIuCQAAAgAAAAECAAAAHk9ubHkgQ2xpZW50IGNhbiBjYW5jZWwgYXVjdGlvbgAAAAFpAQAAAAtvcGVuRGlzcHV0ZQAAAAEAAAAJYXVjdGlvbklkBAAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABFhdWN0aW9uRnJlZWxhbmNlcgkBAAAAF2dldEF1Y3Rpb25GcmVlbGFuY2VyUHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABNjbGllbnRKb2JzSW5EaXNwdXRlCQEAAAAGZ2V0SW50AAAAAQkAASwAAAACBQAAAA1hdWN0aW9uQ2xpZW50AgAAAA5fSm9ic0luRGlzcHV0ZQMDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzBgkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAAEXN0YXRlV2FpdDRDb25maXJtAwMJAAAAAAAAAgUAAAAGY2FsbGVyBQAAAA1hdWN0aW9uQ2xpZW50BgkAAAAAAAACBQAAAAZjYWxsZXIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBQAAAAxzdGF0ZURpc3B1dGUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fRGlzcHV0ZVZvdGVzAAAAAAAAAAAACQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADWF1Y3Rpb25DbGllbnQCAAAADl9Kb2JzSW5EaXNwdXRlCQAAZAAAAAIFAAAAE2NsaWVudEpvYnNJbkRpc3B1dGUAAAAAAAAAAAEFAAAAA25pbAkAAAIAAAABAgAAACtPbmx5IENsaWVudCBhbmQgRnJlZWxhbmNlciBjYW4gb3BlbiBkaXNwdXRlCQAAAgAAAAECAAAAK0luY29ycmVjdCBhdWN0aW9uIHN0YXRlIGZvciBkaXNwdXRlIG9wZW5pbmcAAAABaQEAAAALdm90ZURpc3B1dGUAAAACAAAACWF1Y3Rpb25JZAAAAAR2b3RlBAAAAAljYWxsZXJQdWIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uU3RhdGUJAQAAAA9nZXRBdWN0aW9uU3RhdGUAAAABBQAAAAlhdWN0aW9uSWQEAAAADWF1Y3Rpb25DbGllbnQJAQAAABNnZXRBdWN0aW9uQ2xpZW50UHViAAAAAQUAAAAJYXVjdGlvbklkBAAAABBhdWN0aW9uQXNzZXROYW1lCQEAAAATZ2V0QXVjdGlvbkFzc2V0TmFtZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblByaWNlCQEAAAAPZ2V0QXVjdGlvblByaWNlAAAAAQUAAAAJYXVjdGlvbklkBAAAABFhdWN0aW9uRnJlZWxhbmNlcgkBAAAAF2dldEF1Y3Rpb25GcmVlbGFuY2VyUHViAAAAAQUAAAAJYXVjdGlvbklkBAAAAApjb21taXNzaW9uCQAAaQAAAAIJAABoAAAAAgUAAAAMYXVjdGlvblByaWNlAAAAAAAAAAADAAAAAAAAAABkBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAASQXNzZXROYW1lVG9Bc3NldElkAAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAANYW1iYXNzYWRvclB1YgkBAAAAEmNhbGxlcklzQW1iYXNzYWRvcgAAAAEFAAAACWNhbGxlclB1YgQAAAAOYW1iYXNzYWRvclZvdGUJAQAAABNhbWJhc3NhZG9yVm90ZUNoZWNrAAAAAwUAAAAJYXVjdGlvbklkBQAAAA1hbWJhc3NhZG9yUHViBQAAAAR2b3RlBAAAAAt2b3Rlc051bWJlcgkBAAAADmdldFZvdGVzTnVtYmVyAAAAAQUAAAAJYXVjdGlvbklkBAAAABNjbGllbnRKb2JzSW5EaXNwdXRlCQEAAAAGZ2V0SW50AAAAAQkAASwAAAACBQAAAA1hdWN0aW9uQ2xpZW50AgAAAA5fSm9ic0luRGlzcHV0ZQQAAAAZZnJlZWxhbmNlclBlbmRpbmdFYXJuaW5ncwkBAAAABmdldEludAAAAAEJAAEsAAAAAgUAAAARYXVjdGlvbkZyZWVsYW5jZXICAAAAEF9QZW5kaW5nRWFybmluZ3MEAAAAF2ZyZWVsYW5jZXJUb3RhbEVhcm5pbmdzCQEAAAAGZ2V0SW50AAAAAQkAASwAAAACBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAAOX1RvdGFsRWFybmluZ3MDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAMc3RhdGVEaXNwdXRlAwkAAAAAAAACBQAAAAt2b3Rlc051bWJlcgAAAAAAAAAABAQAAAAQZGlzcHV0ZVdpbm5lclB1YgkBAAAAE2RlZmluZURpc3B1dGVXaW5uZXIAAAAEBQAAAAlhdWN0aW9uSWQFAAAADmFtYmFzc2Fkb3JWb3RlBQAAAA1hdWN0aW9uQ2xpZW50BQAAABFhdWN0aW9uRnJlZWxhbmNlcgQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlAwkAAAAAAAACBQAAABBkaXNwdXRlV2lubmVyUHViBQAAAA1hdWN0aW9uQ2xpZW50BAAAABJwYXltZW50V2l0aG91dENvbW0JAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAApjb21taXNzaW9uCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAADV9EaXNwdXRlVm90ZXMJAABkAAAAAgUAAAALdm90ZXNOdW1iZXIAAAAAAAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAAFHN0YXRlRGlzcHV0ZVJlc29sdmVkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAxfRGlwdXRlVm90ZV8FAAAADWFtYmFzc2Fkb3JQdWIFAAAADmFtYmFzc2Fkb3JWb3RlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAACF9GcmVlemVkBQAAABFuZXdGcmVlemVkQmFsYW5jZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA1hdWN0aW9uQ2xpZW50AgAAAA5fSm9ic0luRGlzcHV0ZQkAAGUAAAACBQAAABNjbGllbnRKb2JzSW5EaXNwdXRlAAAAAAAAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyAgAAABBfUGVuZGluZ0Vhcm5pbmdzCQAAZQAAAAIFAAAAGWZyZWVsYW5jZXJQZW5kaW5nRWFybmluZ3MFAAAADGF1Y3Rpb25QcmljZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAAOX1RvdGFsRWFybmluZ3MJAABlAAAAAgUAAAAXZnJlZWxhbmNlclRvdGFsRWFybmluZ3MFAAAADGF1Y3Rpb25QcmljZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAQZGlzcHV0ZVdpbm5lclB1YgUAAAAScGF5bWVudFdpdGhvdXRDb21tBQAAABBhdWN0aW9uQXNzZXRJZDU4BQAAAANuaWwEAAAAEnBheW1lbnRXaXRob3V0Q29tbQkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UJAABoAAAAAgUAAAAKY29tbWlzc2lvbgAAAAAAAAAAAgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAA1fRGlzcHV0ZVZvdGVzCQAAZAAAAAIFAAAAC3ZvdGVzTnVtYmVyAAAAAAAAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAGX1N0YXRlBQAAABRzdGF0ZURpc3B1dGVSZXNvbHZlZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfBQAAAA1hbWJhc3NhZG9yUHViBQAAAA5hbWJhc3NhZG9yVm90ZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAAhfRnJlZXplZAUAAAARbmV3RnJlZXplZEJhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANYXVjdGlvbkNsaWVudAIAAAAOX0pvYnNJbkRpc3B1dGUJAABlAAAAAgUAAAATY2xpZW50Sm9ic0luRGlzcHV0ZQAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAAQX1BlbmRpbmdFYXJuaW5ncwkAAGUAAAACBQAAABlmcmVlbGFuY2VyUGVuZGluZ0Vhcm5pbmdzBQAAAAxhdWN0aW9uUHJpY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQACWQAAAAEFAAAAEGRpc3B1dGVXaW5uZXJQdWIFAAAAEnBheW1lbnRXaXRob3V0Q29tbQUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0Rpc3B1dGVWb3RlcwkAAGQAAAACBQAAAAt2b3Rlc051bWJlcgAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAMX0RpcHV0ZVZvdGVfBQAAAA1hbWJhc3NhZG9yUHViBQAAAA5hbWJhc3NhZG9yVm90ZQUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgIAAAAaSW5jb3JyZWN0IHN0YXRlLiBNdXN0IGJlOiAFAAAADHN0YXRlRGlzcHV0ZQAAAAFpAQAAAAx3b3JrSGFuZE92ZXIAAAABAAAACWF1Y3Rpb25JZAQAAAAJY2FsbGVyUHViCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXJ0CQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgkBAAAAHGdldEF1Y3Rpb25Kb2JQZXJmb3JtYW5jZVRpbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQEAAAAXZ2V0QXVjdGlvbkZyZWVsYW5jZXJQdWIAAAABBQAAAAlhdWN0aW9uSWQEAAAACnRpbWVJc092ZXIJAABmAAAAAgkAAGUAAAACBQAAAAZoZWlnaHQFAAAADGF1Y3Rpb25TdGFydAUAAAAZYXVjdGlvbkJsb2Nrc0ZvckV4ZWN1dGlvbgQAAAATY2xpZW50Sm9ic0luRGlzcHV0ZQkBAAAABmdldEludAAAAAEJAAEsAAAAAgUAAAANYXVjdGlvbkNsaWVudAIAAAAOX0pvYnNJbkRpc3B1dGUDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAARYXVjdGlvbkZyZWVsYW5jZXIDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzAwUAAAAKdGltZUlzT3ZlcgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAAMc3RhdGVEaXNwdXRlCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAANX0Rpc3B1dGVWb3RlcwIAAAABMAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAA1hdWN0aW9uQ2xpZW50AgAAAA1fSm9iSW5EaXNwdXRlCQAAZAAAAAIFAAAAE2NsaWVudEpvYnNJbkRpc3B1dGUAAAAAAAAAAAEFAAAAA25pbAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAABl9TdGF0ZQUAAAARc3RhdGVXYWl0NENvbmZpcm0FAAAAA25pbAkAAAIAAAABAgAAABpBdWN0aW9uIHN0YXRlIGlzIGluY29ycmVjdAkAAAIAAAABAgAAADRPbmx5IGEgZnJlZWxhbmNlciBjYW4gaW5kaWNhdGUgdGhhdCB0aGUgd29yayBpcyBkb25lAAAAAWkBAAAACmFjY2VwdFdvcmsAAAABAAAACWF1Y3Rpb25JZAQAAAAJY2FsbGVyUHViCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAMYXVjdGlvblN0YXRlCQEAAAAPZ2V0QXVjdGlvblN0YXRlAAAAAQUAAAAJYXVjdGlvbklkBAAAAA1hdWN0aW9uQ2xpZW50CQEAAAATZ2V0QXVjdGlvbkNsaWVudFB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXJ0CQEAAAATZ2V0QXVjdGlvblN0YXJ0VGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAAWZ2V0QXVjdGlvbkR1cmF0aW9uVGltZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAQYXVjdGlvbkFzc2V0TmFtZQkBAAAAE2dldEF1Y3Rpb25Bc3NldE5hbWUAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25QcmljZQkBAAAAD2dldEF1Y3Rpb25QcmljZQAAAAEFAAAACWF1Y3Rpb25JZAQAAAARYXVjdGlvbkZyZWVsYW5jZXIJAQAAABdnZXRBdWN0aW9uRnJlZWxhbmNlclB1YgAAAAEFAAAACWF1Y3Rpb25JZAQAAAALam9ic09uR29pbmcJAQAAAAZnZXRJbnQAAAABCQABLAAAAAIFAAAADWF1Y3Rpb25DbGllbnQCAAAADF9Kb2JzT25Hb2luZwQAAAAZZnJlZWxhbmNlclBlbmRpbmdFYXJuaW5ncwkBAAAABmdldEludAAAAAEJAAEsAAAAAgUAAAARYXVjdGlvbkZyZWVsYW5jZXICAAAAEF9QZW5kaW5nRWFybmluZ3MEAAAAFmZyZWVsYW5jZXJQYWlkRWFybmluZ3MJAQAAAAZnZXRJbnQAAAABCQABLAAAAAIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyAgAAAA1fUGFpZEVhcm5pbmdzBAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAADGF1Y3Rpb25QcmljZQAAAAAAAAAAAwAAAAAAAAAAZAQAAAARYW1vdW50V2l0aG91dENvbW0JAABlAAAAAgUAAAAMYXVjdGlvblByaWNlCQAAaAAAAAIFAAAADmRBcHBDb21taXNzaW9uAAAAAAAAAAACBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAASQXNzZXROYW1lVG9Bc3NldElkAAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAARbmV3RnJlZXplZEJhbGFuY2UJAQAAABZkZWNyZWFzZUZyZWV6ZWRCYWxhbmNlAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQUAAAAMYXVjdGlvblByaWNlBAAAABBmcmVlbGFuY2VyUmF0aW5nCQEAAAAJZ2V0UmF0aW5nAAAAAQUAAAARYXVjdGlvbkZyZWVsYW5jZXIDCQAAAAAAAAIFAAAACWNhbGxlclB1YgUAAAANYXVjdGlvbkNsaWVudAMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAABFzdGF0ZVdhaXQ0Q29uZmlybQkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAZfU3RhdGUFAAAADXN0YXRlQ29tcGxldGUJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAARYXVjdGlvbkZyZWVsYW5jZXICAAAAB19SYXRpbmcJAABkAAAAAgUAAAAQZnJlZWxhbmNlclJhdGluZwAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAAhfRnJlZXplZAUAAAARbmV3RnJlZXplZEJhbGFuY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANYXVjdGlvbkNsaWVudAIAAAAMX0pvYnNPbkdvaW5nCQAAZQAAAAIFAAAAC2pvYnNPbkdvaW5nAAAAAAAAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyAgAAABBfUGVuZGluZ0Vhcm5pbmdzCQAAZQAAAAIFAAAAGWZyZWVsYW5jZXJQZW5kaW5nRWFybmluZ3MFAAAADGF1Y3Rpb25QcmljZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAANX1BhaWRFYXJuaW5ncwkAAGQAAAACBQAAABZmcmVlbGFuY2VyUGFpZEVhcm5pbmdzBQAAAAxhdWN0aW9uUHJpY2UFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQACWQAAAAEFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyBQAAABFhbW91bnRXaXRob3V0Q29tbQUAAAAQYXVjdGlvbkFzc2V0SWQ1OAUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgIAAAAaSW5jb3JyZWN0IHN0YXRlLiBNdXN0IGJlOiAFAAAAEXN0YXRlV2FpdDRDb25maXJtCQAAAgAAAAECAAAAK09ubHkgYXVjdGlvbiBjdXN0b21lciBjYW4gdXNlIHRoaXMgZnVuY3Rpb24AAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDAEAAAACWFzc2V0TmFtZQkBAAAAEkFzc2V0SWRUb0Fzc2V0TmFtZQAAAAEIBQAAAAN0dHgAAAAHYXNzZXRJZAQAAAAUdmFsdWVSZXNlcnZlZEJhbGFuY2UJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAlhc3NldE5hbWUCAAAACV9SZXNlcnZlZAQAAAAPcmVzZXJ2ZWRCYWxhbmNlBAAAAAckbWF0Y2gxBQAAABR2YWx1ZVJlc2VydmVkQmFsYW5jZQMJAAABAAAAAgUAAAAHJG1hdGNoMQIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gxBQAAAAFhAAAAAAAAAAAABAAAABBhdmFpbGFibGVCYWxhbmNlCQAAZQAAAAIJAAPrAAAAAgUAAAAEdGhpcwgFAAAAA3R0eAAAAAdhc3NldElkBQAAAA9yZXNlcnZlZEJhbGFuY2UJAABnAAAAAgUAAAAQYXZhaWxhYmxlQmFsYW5jZQgFAAAAA3R0eAAAAAZhbW91bnQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBAAAAANzdHgFAAAAByRtYXRjaDAGBwcT2gjf", "chainId": 84, "height": 719504, "spentComplexity": 0 } View: original | compacted Prev: SA49YpFDw2LFfJT6bTi5BiQQwgdbFtsNBJzDxsCnSXb Next: 5BUM7Kj8n12HoTQxRt7bxEBBxXHJWEVR3FGk1wuxsu5r Diff:
OldNewDifferences
1010 let wEUR = base58'Gtb1WRznfchDnTh37ezoDTJ4wcoKaRsKqKjJjy7nm2zU'
1111
1212 let wUSD = base58'Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck'
13+
14+let auctToken = base58'1'
1315
1416 let stateOpen = "Opened"
1517
3133
3234 let freelancer = "FL"
3335
34-let ambassador1 = base58'FneCJqM5BP2eAuyteMiuEEHYALrE4axhEfcpHVGbdr5s'
36+let ambassador1 = "FneCJqM5BP2eAuyteMiuEEHYALrE4axhEfcpHVGbdr5s"
3537
36-let ambassador2 = base58'6QAMdssb1GJjpQVQQcnx8fKU8WhtcF9ZsQhifdThAEK8'
38+let ambassador2 = "6QAMdssb1GJjpQVQQcnx8fKU8WhtcF9ZsQhifdThAEK8"
3739
38-let ambassador3 = base58'2ituwW7DSRsLP3Vcbnpr98QUQMGFRWKmyYPFqsUKRDoP'
40+let ambassador3 = "2ituwW7DSRsLP3Vcbnpr98QUQMGFRWKmyYPFqsUKRDoP"
3941
40-let ambassador4 = base58'ANsPQocEESyLb3yQqk2pwCdoK7PJQxLoZVpYvsm3SxUG'
42+let ambassador4 = "ANsPQocEESyLb3yQqk2pwCdoK7PJQxLoZVpYvsm3SxUG"
4143
42-let ambassador5 = base58'13VixwQin1MzZCyY69NSWMSBNEV27Rzc159o7uZXR9VS'
43-
44-func AuctionIdDataKey (auctionId) = (auctionId + "_AuctionData")
45-
44+let ambassador5 = "13VixwQin1MzZCyY69NSWMSBNEV27Rzc159o7uZXR9VS"
4645
4746 func getInt (key) = {
4847 let valueJobsOnGoing = getInteger(this, key)
5554 }
5655
5756
58-func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES"))
57+func AssetIdToAssetName (pmtAssetId) = if (!(isDefined(pmtAssetId)))
58+ then "WAVES"
59+ else if ((pmtAssetId == wBTC))
60+ then "BTC"
61+ else if ((pmtAssetId == wEUR))
62+ then "EUR"
63+ else if ((pmtAssetId == wUSD))
64+ then "USD"
65+ else if ((pmtAssetId == auctToken))
66+ then "AUCT"
67+ else throw("AssetId is incorrect")
68+
69+
70+func AssetNameToAssetId (auctionAssetName) = if ((auctionAssetName == "WAVES"))
5971 then WAVES
6072 else if ((auctionAssetName == "BTC"))
6173 then wBTC
6375 then wEUR
6476 else if ((auctionAssetName == "USD"))
6577 then wUSD
66- else throw("Incorrect Asset Id")
78+ else if ((auctionAssetName == "AUCT"))
79+ then auctToken
80+ else throw("Incorrect Asset Id")
6781
6882
6983 func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime)
101115 }
102116
103117
104-func freelancerIsRegistered (callerPub) = {
118+func clientRegistered (callerPub) = {
119+ let freelancerIsRegistered = getString(this, (callerPub + "_Freelancer"))
120+ match freelancerIsRegistered {
121+ case a: String =>
122+ callerPub
123+ case _ =>
124+ throw("Only registered users can make bets")
125+ }
126+ }
127+
128+
129+func freelancerRegistered (callerPub) = {
105130 let freelancerIsRegistered = getString(this, (callerPub + "_Freelancer"))
106131 match freelancerIsRegistered {
107132 case a: String =>
129154
130155
131156 func getAuctionClientPub (auctionId) = {
132- let valueClient = getString(this, (auctionId + "_AuctionClient"))
133- let clientPub = match valueClient {
157+ let valueClientPub = getString(this, (auctionId + "_AuctionClient"))
158+ match valueClientPub {
134159 case a: String =>
135160 a
136161 case _ =>
137162 throw("Auction Client was not found")
138163 }
139- fromBase58String(clientPub)
140164 }
141165
142166
197221
198222 func getAuctionFreelancerPub (auctionId) = {
199223 let valueClient = getString(this, (auctionId + "_HiredFreelancer"))
200- let a = match valueClient {
224+ match valueClient {
201225 case a: String =>
202226 a
203227 case _ =>
204228 throw("Auction Client was not found")
205229 }
206- fromBase58String(a)
230+ }
231+
232+
233+func getAuctionLowestBidder (auctionId) = {
234+ let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
235+ match valueLowestBidder {
236+ case a: String =>
237+ a
238+ case _ =>
239+ throw("Auction lowest bidder was not found")
240+ }
241+ }
242+
243+
244+func getBid (auctionId,auctionLowestBidder) = {
245+ let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
246+ match valueNewAuctionPrice {
247+ case a: Int =>
248+ a
249+ case _ =>
250+ throw("Auction lowest bid was not found")
251+ }
252+ }
253+
254+
255+func defineNewLowestBidder (auctionId,currentLowestBidderPub,bidAmount,newFreelancer) = {
256+ let valueCurrentLowestBid = getInteger(this, ((auctionId + "_Bid_") + currentLowestBidderPub))
257+ let currentLowestBid = match valueCurrentLowestBid {
258+ case a: Int =>
259+ a
260+ case _ =>
261+ throw("Auction lowest bid was not found")
262+ }
263+ if ((currentLowestBid > bidAmount))
264+ then newFreelancer
265+ else currentLowestBidderPub
266+ }
267+
268+
269+func choosedFreelancerCheck (auctionId,freelancerPub) = {
270+ let newFreelancer = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
271+ match newFreelancer {
272+ case a: Int =>
273+ freelancerPub
274+ case _ =>
275+ throw("Error: Incorrect freelancerPub")
276+ }
277+ }
278+
279+
280+func newExecutionTimeCheck (executionDays,auctionBlocksForExecution) = {
281+ let newAuctionBlocksForExecution = (executionDays * day)
282+ if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
283+ then newAuctionBlocksForExecution
284+ else throw("New execution time must more than current execution time")
285+ }
286+
287+
288+func getRating (auctionFreelancer) = {
289+ let valueRating = getInteger(this, (auctionFreelancer + "_Rating"))
290+ match valueRating {
291+ case a: Int =>
292+ a
293+ case _ =>
294+ 0
295+ }
296+ }
297+
298+
299+func callerIsAmbassador (callerPub) = if (if (if (if (if ((callerPub == ambassador1))
300+ then true
301+ else (callerPub == ambassador2))
302+ then true
303+ else (callerPub == ambassador3))
304+ then true
305+ else (callerPub == ambassador4))
306+ then true
307+ else (callerPub == ambassador5))
308+ then callerPub
309+ else throw("Only defined ambassadors can vote in disputes")
310+
311+
312+func ambassadorVoteCheck (auctionId,ambassadorPub,vote) = {
313+ let keyVoter = ((auctionId + "_DiputeVote_") + ambassadorPub)
314+ let valueVoter = getString(this, keyVoter)
315+ let ambassadorVoted = match valueVoter {
316+ case a: String =>
317+ true
318+ case _ =>
319+ false
320+ }
321+ if (ambassadorVoted)
322+ then throw("Ambassador voted already ")
323+ else if (if ((vote == client))
324+ then true
325+ else (vote == freelancer))
326+ then vote
327+ else throw(((("Vote is incorrect. Must be: " + client) + " or ") + freelancer))
328+ }
329+
330+
331+func getVotesNumber (auctionId) = {
332+ let valueVotesNumber = getInteger(this, (auctionId + "_DisputeVotes"))
333+ match valueVotesNumber {
334+ case a: Int =>
335+ a
336+ case _ =>
337+ throw("VotesNumber was not found")
338+ }
339+ }
340+
341+
342+func defineDisputeWinner (auctionId,newVote,auctionClient,auctionFreelancer) = {
343+ let ambassador1Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador1))
344+ let ambassador2Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador2))
345+ let ambassador3Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador3))
346+ let ambassador4Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador4))
347+ let ambassador5Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador5))
348+ let v1 = if ((ambassador1Vote == client))
349+ then 1
350+ else 0
351+ let v2 = if ((ambassador2Vote == client))
352+ then 1
353+ else 0
354+ let v3 = if ((ambassador3Vote == client))
355+ then 1
356+ else 0
357+ let v4 = if ((ambassador4Vote == client))
358+ then 1
359+ else 0
360+ let v5 = if ((ambassador5Vote == client))
361+ then 1
362+ else 0
363+ let currentVote = if ((newVote == client))
364+ then 1
365+ else 0
366+ let votesForClient = (((((v1 + v2) + v3) + v4) + v5) + currentVote)
367+ if ((votesForClient > 2))
368+ then auctionClient
369+ else auctionFreelancer
207370 }
208371
209372
231394
232395 @Callable(i)
233396 func createAuction (jobExecutionDays,auctionDurationDays,auctionInfo) = {
397+ let callerPub = toBase58String(i.callerPublicKey)
234398 let auctionId = toBase58String(i.transactionId)
235- let auctionClient = toBase58String(i.callerPublicKey)
399+ let auctionClient = clientRegistered(callerPub)
236400 let pmt = extract(i.payment)
237401 let pmtAmount = pmt.amount
238402 let auctionPrice = createAuctionPriceCheck(pmtAmount)
239403 let auctionStart = height
240404 let auctionDurationBlocks = (auctionDurationDays * day)
241405 let blocksForExecution = (jobExecutionDays * day)
242- let pmtAssetName = if (!(isDefined(pmt.assetId)))
243- then "WAVES"
244- else if ((pmt.assetId == wBTC))
245- then "BTC"
246- else if ((pmt.assetId == wEUR))
247- then "EUR"
248- else if ((pmt.assetId == wUSD))
249- then "USD"
250- else throw("AssetId is incorrect")
406+ let pmtAssetName = AssetIdToAssetName(pmt.assetId)
251407 let jobsCreated = getInt((auctionClient + "_JobsCreated"))
252408 let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
253409 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), DataEntry((auctionClient + "_JobsCreated"), (jobsCreated + 1))])
258414 @Callable(i)
259415 func makeBid (auctionId,amount) = {
260416 let callerPub = toBase58String(i.callerPublicKey)
261- let betTime = height
262417 let auctionState = getAuctionState(auctionId)
263418 let auctionClient = getAuctionClientPub(auctionId)
264419 let auctionStart = getAuctionStartTime(auctionId)
266421 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
267422 let auctionAssetName = getAuctionAssetName(auctionId)
268423 let auctionPrice = getAuctionPrice(auctionId)
269- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
270- let newFreelancer = freelancerIsRegistered(callerPub)
424+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
425+ let newFreelancer = freelancerRegistered(callerPub)
271426 let dAppCommission = ((auctionPrice * 3) / 100)
272427 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
273428 let bidAmount = bidAmountCheck(amount, auctionPrice)
274- let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
429+ let auctionTimeisOver = timeCheck(height, auctionStart, auctionDuration)
275430 if (auctionTimeisOver)
276431 then if ((auctionState == stateOpen))
277- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
432+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), (auctionPrice - dAppCommission), auctionAssetId58)]))
278433 else if ((auctionState == stateSuggested))
279434 then {
280- let auctionLowestBidder = {
281- let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
282- match valueLowestBidder {
283- case a: String =>
284- a
285- case _ =>
286- throw("Auction lowest bidder was not found")
287- }
288- }
289- let newAuctionPrice = {
290- let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
291- match valueNewAuctionPrice {
292- case a: Int =>
293- a
294- case _ =>
295- throw("Auction lowest bid was not found")
296- }
297- }
298- let amountDifference = ((auctionPrice - newAuctionPrice) - dAppCommission)
299- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
435+ let auctionLowestBidder = getAuctionLowestBidder(auctionId)
436+ let auctionLowestBid = getBid(auctionId, auctionLowestBidder)
437+ let amountDifference = ((auctionPrice - auctionLowestBid) - dAppCommission)
438+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), auctionLowestBid)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), amountDifference, auctionAssetId58)]))
300439 }
301440 else throw("Incorrect auction state")
302441 else if ((auctionState == stateOpen))
303442 then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), bidAmount), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub)])
304443 else if ((auctionState == stateSuggested))
305444 then {
306- let currentLowestBidderPub = {
307- let lowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
308- match lowestBidder {
309- case a: String =>
310- a
311- case _ =>
312- throw("Auction lowest bidder was not found")
313- }
314- }
315- let newLowestBidderPub = {
316- let valueCurrentLowestBid = getInteger(this, ((auctionId + "_Bid_") + currentLowestBidderPub))
317- let currentLowestBid = match valueCurrentLowestBid {
318- case a: Int =>
319- a
320- case _ =>
321- throw("Auction lowest bid was not found")
322- }
323- if ((currentLowestBid > bidAmount))
324- then newFreelancer
325- else currentLowestBidderPub
326- }
445+ let currentLowestBidderPub = getAuctionLowestBidder(auctionId)
446+ let newLowestBidderPub = defineNewLowestBidder(auctionId, currentLowestBidderPub, bidAmount, newFreelancer)
327447 WriteSet([DataEntry((auctionId + "_LowestBidderPub"), newLowestBidderPub), DataEntry(((auctionId + "_Bid_") + newFreelancer), bidAmount)])
328448 }
329449 else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested))
333453
334454 @Callable(i)
335455 func chooseFreelancer (auctionId,freelancerPub) = {
336- let callerPub = extract(i.callerPublicKey)
337- let betTime = height
456+ let callerPub = toBase58String(i.callerPublicKey)
338457 let auctionState = getAuctionState(auctionId)
339458 let auctionClient = getAuctionClientPub(auctionId)
340459 let auctionStart = getAuctionStartTime(auctionId)
341460 let auctionDuration = getAuctionDurationTime(auctionId)
342461 let auctionAssetName = getAuctionAssetName(auctionId)
343462 let auctionPrice = getAuctionPrice(auctionId)
344- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
345- let jobsOnGoing = getInt((toBase58String(auctionClient) + "_JobsOnGoing"))
463+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
464+ let newFreelancer = choosedFreelancerCheck(auctionId, freelancerPub)
465+ let freelancerBidAmount = getBid(auctionId, newFreelancer)
466+ let auctionTimeisOver = timeCheck(height, auctionStart, auctionDuration)
467+ let jobsOnGoing = getInt((auctionClient + "_JobsOnGoing"))
346468 let freelancerPendingEarnings = getInt((freelancerPub + "_PendingEarnings"))
347469 let freelancerTotalEarnings = getInt((freelancerPub + "_TotalEarnings"))
348- let freelancerBidAmount = {
349- let keyFreelancerBid = ((auctionId + "_Bid_") + freelancerPub)
350- let valueFreelacerBid = getInteger(this, keyFreelancerBid)
351- match valueFreelacerBid {
352- case a: Int =>
353- a
354- case _ =>
355- throw("Freelancer's bet was not found")
356- }
357- }
358- let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
359470 if ((callerPub == auctionClient))
360471 then if (auctionTimeisOver)
361472 then if ((auctionState == stateOpen))
362473 then {
363474 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
364475 let dAppCommission = ((auctionPrice * 3) / 100)
365- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
476+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), (auctionPrice - dAppCommission), auctionAssetId58)]))
366477 }
367478 else if ((auctionState == stateSuggested))
368479 then {
369- let auctionLowestBidder = {
370- let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
371- match valueLowestBidder {
372- case a: String =>
373- a
374- case _ =>
375- throw("Auction lowest bidder was not found")
376- }
377- }
378- let newAuctionPrice = {
379- let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
380- match valueNewAuctionPrice {
381- case a: Int =>
382- a
383- case _ =>
384- throw("Auction lowest bid was not found")
385- }
386- }
387- let amountDifference = (auctionPrice - newAuctionPrice)
480+ let auctionLowestBidder = getAuctionLowestBidder(auctionId)
481+ let auctionLowestBid = getBid(auctionId, auctionLowestBidder)
482+ let amountDifference = (auctionPrice - auctionLowestBid)
388483 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
389- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + newAuctionPrice)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + newAuctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
484+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), auctionLowestBid), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + auctionLowestBid)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + auctionLowestBid))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), amountDifference, auctionAssetId58)]))
390485 }
391486 else throw("Incorrect auction state")
392487 else if (if ((auctionState == stateOpen))
393488 then true
394489 else (auctionState == stateSuggested))
395490 then {
396- let setNewFreelancer = {
397- let newFreelancer = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
398- match newFreelancer {
399- case a: Int =>
400- freelancerPub
401- case _ =>
402- throw("Error: Incorrect freelancerPub")
403- }
404- }
405- let newAuctionPrice = {
406- let freelancerBid = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
407- match freelancerBid {
408- case a: Int =>
409- a
410- case _ =>
411- throw("Auction lowest bidder was not found")
412- }
413- }
414491 let amountDifference = (auctionPrice - freelancerBidAmount)
415492 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
416- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + newAuctionPrice)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + newAuctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (amountDifference + 1), auctionAssetId58)]))
493+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), newFreelancer), DataEntry((auctionId + "_Price"), freelancerBidAmount), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + freelancerBidAmount)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + freelancerBidAmount))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), (amountDifference + 1), auctionAssetId58)]))
417494 }
418495 else throw("Incorrect auction state")
419496 else throw("Only auction customer can choose a freelancer")
423500
424501 @Callable(i)
425502 func increaseExecutionTime (auctionId,executionDays) = {
426- let caller = extract(i.callerPublicKey)
503+ let caller = toBase58String(i.callerPublicKey)
427504 let auctionState = getAuctionState(auctionId)
428505 let auctionClient = getAuctionClientPub(auctionId)
429506 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
430- let newAuctionExecutionTime = {
431- let newAuctionBlocksForExecution = (executionDays * day)
432- if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
433- then newAuctionBlocksForExecution
434- else throw("New execution time must more than current execution time")
435- }
507+ let newAuctionExecutionTime = newExecutionTimeCheck(executionDays, auctionBlocksForExecution)
436508 if ((caller == auctionClient))
437509 then if (if (if ((auctionState == stateOpen))
438510 then true
448520
449521 @Callable(i)
450522 func cancelAuction (auctionId) = {
451- let callerPub = extract(i.callerPublicKey)
523+ let callerPub = toBase58String(i.callerPublicKey)
452524 let auctionState = getAuctionState(auctionId)
453525 let auctionClient = getAuctionClientPub(auctionId)
454526 let auctionAssetName = getAuctionAssetName(auctionId)
455527 let auctionPrice = getAuctionPrice(auctionId)
456- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
528+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
457529 let dAppCommission = ((auctionPrice * 3) / 100)
458530 let amountWithoutComm = (auctionPrice - dAppCommission)
459531 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
460532 if ((callerPub == auctionClient))
461533 then if ((auctionState == stateOpen))
462- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountWithoutComm, auctionAssetId58)]))
534+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), amountWithoutComm, auctionAssetId58)]))
463535 else throw("Auction can be canceled only by auction owner.")
464536 else throw("Only Client can cancel auction")
465537 }
468540
469541 @Callable(i)
470542 func openDispute (auctionId) = {
471- let caller = extract(i.callerPublicKey)
543+ let caller = toBase58String(i.callerPublicKey)
472544 let auctionState = getAuctionState(auctionId)
473545 let auctionClient = getAuctionClientPub(auctionId)
474546 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
475- let clientJobsInDispute = getInt((toBase58String(auctionClient) + "_JobsInDispute"))
547+ let clientJobsInDispute = getInt((auctionClient + "_JobsInDispute"))
476548 if (if ((auctionState == stateInProgress))
477549 then true
478550 else (auctionState == stateWait4Confirm))
479551 then if (if ((caller == auctionClient))
480552 then true
481553 else (caller == auctionFreelancer))
482- then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), 0), DataEntry((toBase58String(auctionClient) + "_JobsInDispute"), (clientJobsInDispute + 1))])
554+ then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), 0), DataEntry((auctionClient + "_JobsInDispute"), (clientJobsInDispute + 1))])
483555 else throw("Only Client and Freelancer can open dispute")
484556 else throw("Incorrect auction state for dispute opening")
485557 }
488560
489561 @Callable(i)
490562 func voteDispute (auctionId,vote) = {
491- let callerPub = extract(i.callerPublicKey)
563+ let callerPub = toBase58String(i.callerPublicKey)
492564 let auctionState = getAuctionState(auctionId)
493565 let auctionClient = getAuctionClientPub(auctionId)
494566 let auctionAssetName = getAuctionAssetName(auctionId)
495567 let auctionPrice = getAuctionPrice(auctionId)
496568 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
497569 let commission = ((auctionPrice * 3) / 100)
498- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
499- let clientJobsInDispute = getInt((toBase58String(auctionClient) + "_JobsInDispute"))
500- let freelancerPendingEarnings = getInt((toBase58String(auctionFreelancer) + "_PendingEarnings"))
501- let callerIsAmbassador = if (if (if (if (if ((callerPub == ambassador1))
502- then true
503- else (callerPub == ambassador2))
504- then true
505- else (callerPub == ambassador3))
506- then true
507- else (callerPub == ambassador4))
508- then true
509- else (callerPub == ambassador5))
510- then toBase58String(callerPub)
511- else throw("Only defined ambassadors can vote in disputes")
512- let newVote = if (if ((vote == client))
513- then true
514- else (vote == freelancer))
515- then vote
516- else throw(((("Vote is incorrect. Must be: " + client) + " or ") + freelancer))
517- let newVoter = {
518- let keyVoter = ((auctionId + "_DiputeVote_") + callerIsAmbassador)
519- let valueVoter = getString(this, keyVoter)
520- match valueVoter {
521- case a: String =>
522- throw("User already voted")
523- case _ =>
524- callerIsAmbassador
525- }
526- }
527- let votesNumber = {
528- let valueVotesNumber = getInteger(this, (auctionId + "_DisputeVotes"))
529- match valueVotesNumber {
530- case a: Int =>
531- a
532- case _ =>
533- throw("VotesNumber was not found")
534- }
535- }
570+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
571+ let ambassadorPub = callerIsAmbassador(callerPub)
572+ let ambassadorVote = ambassadorVoteCheck(auctionId, ambassadorPub, vote)
573+ let votesNumber = getVotesNumber(auctionId)
574+ let clientJobsInDispute = getInt((auctionClient + "_JobsInDispute"))
575+ let freelancerPendingEarnings = getInt((auctionFreelancer + "_PendingEarnings"))
576+ let freelancerTotalEarnings = getInt((auctionFreelancer + "_TotalEarnings"))
536577 if ((auctionState == stateDispute))
537578 then if ((votesNumber == 4))
538579 then {
539- let disputeWinner = {
540- let ambassador1Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador1)))
541- let ambassador2Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador2)))
542- let ambassador3Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador3)))
543- let ambassador4Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador4)))
544- let ambassador5Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador5)))
545- let v1 = if ((ambassador1Vote == client))
546- then 1
547- else 0
548- let v2 = if ((ambassador2Vote == client))
549- then 1
550- else 0
551- let v3 = if ((ambassador3Vote == client))
552- then 1
553- else 0
554- let v4 = if ((ambassador4Vote == client))
555- then 1
556- else 0
557- let v5 = if ((ambassador5Vote == client))
558- then 1
559- else 0
560- let currentVote = if ((newVote == client))
561- then 1
562- else 0
563- let votesForClient = (((((v1 + v2) + v3) + v4) + v5) + currentVote)
564- if ((votesForClient > 2))
565- then auctionClient
566- else auctionFreelancer
567- }
568- let paymentWithoutComm = if ((disputeWinner == auctionClient))
569- then (auctionPrice - commission)
570- else (auctionPrice - (commission * 2))
580+ let disputeWinnerPub = defineDisputeWinner(auctionId, ambassadorVote, auctionClient, auctionFreelancer)
571581 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
572- ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + newVoter), newVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsInDispute"), (clientJobsInDispute - 1)), DataEntry((toBase58String(auctionFreelancer) + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(disputeWinner), paymentWithoutComm, auctionAssetId58)]))
582+ if ((disputeWinnerPub == auctionClient))
583+ then {
584+ let paymentWithoutComm = (auctionPrice - commission)
585+ ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + ambassadorPub), ambassadorVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsInDispute"), (clientJobsInDispute - 1)), DataEntry((auctionFreelancer + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice)), DataEntry((auctionFreelancer + "_TotalEarnings"), (freelancerTotalEarnings - auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(disputeWinnerPub)), paymentWithoutComm, auctionAssetId58)]))
586+ }
587+ else {
588+ let paymentWithoutComm = (auctionPrice - (commission * 2))
589+ ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + ambassadorPub), ambassadorVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsInDispute"), (clientJobsInDispute - 1)), DataEntry((auctionFreelancer + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(disputeWinnerPub)), paymentWithoutComm, auctionAssetId58)]))
590+ }
573591 }
574- else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + newVoter), newVote)])
592+ else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + ambassadorPub), ambassadorVote)])
575593 else throw(("Incorrect state. Must be: " + stateDispute))
576594 }
577595
579597
580598 @Callable(i)
581599 func workHandOver (auctionId) = {
582- let callerPub = extract(i.callerPublicKey)
600+ let callerPub = toBase58String(i.callerPublicKey)
583601 let auctionState = getAuctionState(auctionId)
584602 let auctionClient = getAuctionClientPub(auctionId)
585603 let auctionStart = getAuctionStartTime(auctionId)
586604 let auctionDuration = getAuctionDurationTime(auctionId)
587605 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
588606 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
589- let clientJobsInDispute = getInt((toBase58String(auctionClient) + "_JobsInDispute"))
590- let currentTime = height
591- let freelancerPubCheck = if ((callerPub == auctionFreelancer))
592- then callerPub
607+ let timeIsOver = ((height - auctionStart) > auctionBlocksForExecution)
608+ let clientJobsInDispute = getInt((auctionClient + "_JobsInDispute"))
609+ if ((callerPub == auctionFreelancer))
610+ then if ((auctionState == stateInProgress))
611+ then if (timeIsOver)
612+ then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0"), DataEntry((auctionClient + "_JobInDispute"), (clientJobsInDispute + 1))])
613+ else WriteSet([DataEntry((auctionId + "_State"), stateWait4Confirm)])
614+ else throw("Auction state is incorrect")
593615 else throw("Only a freelancer can indicate that the work is done")
594- let timeIsOver = ((currentTime - auctionStart) > auctionBlocksForExecution)
595- if ((auctionState == stateInProgress))
596- then if (timeIsOver)
597- then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0"), DataEntry((toBase58String(auctionClient) + "_JobInDispute"), (clientJobsInDispute + 1))])
598- else WriteSet([DataEntry((auctionId + "_State"), stateWait4Confirm)])
599- else throw("Auction state is incorrect")
600616 }
601617
602618
603619
604620 @Callable(i)
605621 func acceptWork (auctionId) = {
606- let callerPub = extract(i.callerPublicKey)
622+ let callerPub = toBase58String(i.callerPublicKey)
607623 let auctionState = getAuctionState(auctionId)
608624 let auctionClient = getAuctionClientPub(auctionId)
609625 let auctionStart = getAuctionStartTime(auctionId)
611627 let auctionAssetName = getAuctionAssetName(auctionId)
612628 let auctionPrice = getAuctionPrice(auctionId)
613629 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
614- let jobsOnGoing = getInt((toBase58String(auctionClient) + "_JobsOnGoing"))
615- let freelancerPendingEarnings = getInt((toBase58String(auctionFreelancer) + "_PendingEarnings"))
616- let freelancerPaidEarnings = getInt((toBase58String(auctionFreelancer) + "_PaidEarnings"))
630+ let jobsOnGoing = getInt((auctionClient + "_JobsOnGoing"))
631+ let freelancerPendingEarnings = getInt((auctionFreelancer + "_PendingEarnings"))
632+ let freelancerPaidEarnings = getInt((auctionFreelancer + "_PaidEarnings"))
617633 let dAppCommission = ((auctionPrice * 3) / 100)
618- let amountWithoutComm = (auctionPrice - dAppCommission)
619- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
634+ let amountWithoutComm = (auctionPrice - (dAppCommission * 2))
635+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
620636 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
621- let newRating = {
622- let valueRating = getInteger(this, (toBase58String(auctionFreelancer) + "_Rating"))
623- let currentRating = match valueRating {
624- case a: Int =>
625- a
626- case _ =>
627- 0
628- }
629- (currentRating + 1)
630- }
637+ let freelancerRating = getRating(auctionFreelancer)
631638 if ((callerPub == auctionClient))
632639 then if ((auctionState == stateWait4Confirm))
633- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsOnGoing"), (jobsOnGoing - 1)), DataEntry((toBase58String(auctionFreelancer) + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice)), DataEntry((toBase58String(auctionFreelancer) + "_PaidEarnings"), (freelancerPaidEarnings + auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
640+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((auctionFreelancer + "_Rating"), (freelancerRating + 1)), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsOnGoing"), (jobsOnGoing - 1)), DataEntry((auctionFreelancer + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice)), DataEntry((auctionFreelancer + "_PaidEarnings"), (freelancerPaidEarnings + auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionFreelancer)), amountWithoutComm, auctionAssetId58)]))
634641 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
635642 else throw("Only auction customer can use this function")
636643 }
640647 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
641648 then match tx {
642649 case ttx: TransferTransaction =>
643- true
650+ let assetName = AssetIdToAssetName(ttx.assetId)
651+ let valueReservedBalance = getInteger(this, (assetName + "_Reserved"))
652+ let reservedBalance = match valueReservedBalance {
653+ case a: Int =>
654+ a
655+ case _ =>
656+ 0
657+ }
658+ let availableBalance = (assetBalance(this, ttx.assetId) - reservedBalance)
659+ (availableBalance >= ttx.amount)
644660 case stx: SetScriptTransaction =>
645661 true
646662 case _ =>
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'
13+
14+let auctToken = base58'1'
1315
1416 let stateOpen = "Opened"
1517
1618 let stateSuggested = "Suggested"
1719
1820 let stateCancel = "Canceled"
1921
2022 let stateInProgress = "InProgress"
2123
2224 let stateWait4Confirm = "WaitForConfirmation"
2325
2426 let stateComplete = "Completed"
2527
2628 let stateDispute = "Dispute"
2729
2830 let stateDisputeResolved = "DisputeResolved"
2931
3032 let client = "CL"
3133
3234 let freelancer = "FL"
3335
34-let ambassador1 = base58'FneCJqM5BP2eAuyteMiuEEHYALrE4axhEfcpHVGbdr5s'
36+let ambassador1 = "FneCJqM5BP2eAuyteMiuEEHYALrE4axhEfcpHVGbdr5s"
3537
36-let ambassador2 = base58'6QAMdssb1GJjpQVQQcnx8fKU8WhtcF9ZsQhifdThAEK8'
38+let ambassador2 = "6QAMdssb1GJjpQVQQcnx8fKU8WhtcF9ZsQhifdThAEK8"
3739
38-let ambassador3 = base58'2ituwW7DSRsLP3Vcbnpr98QUQMGFRWKmyYPFqsUKRDoP'
40+let ambassador3 = "2ituwW7DSRsLP3Vcbnpr98QUQMGFRWKmyYPFqsUKRDoP"
3941
40-let ambassador4 = base58'ANsPQocEESyLb3yQqk2pwCdoK7PJQxLoZVpYvsm3SxUG'
42+let ambassador4 = "ANsPQocEESyLb3yQqk2pwCdoK7PJQxLoZVpYvsm3SxUG"
4143
42-let ambassador5 = base58'13VixwQin1MzZCyY69NSWMSBNEV27Rzc159o7uZXR9VS'
43-
44-func AuctionIdDataKey (auctionId) = (auctionId + "_AuctionData")
45-
44+let ambassador5 = "13VixwQin1MzZCyY69NSWMSBNEV27Rzc159o7uZXR9VS"
4645
4746 func getInt (key) = {
4847 let valueJobsOnGoing = getInteger(this, key)
4948 match valueJobsOnGoing {
5049 case a: Int =>
5150 a
5251 case _ =>
5352 0
5453 }
5554 }
5655
5756
58-func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES"))
57+func AssetIdToAssetName (pmtAssetId) = if (!(isDefined(pmtAssetId)))
58+ then "WAVES"
59+ else if ((pmtAssetId == wBTC))
60+ then "BTC"
61+ else if ((pmtAssetId == wEUR))
62+ then "EUR"
63+ else if ((pmtAssetId == wUSD))
64+ then "USD"
65+ else if ((pmtAssetId == auctToken))
66+ then "AUCT"
67+ else throw("AssetId is incorrect")
68+
69+
70+func AssetNameToAssetId (auctionAssetName) = if ((auctionAssetName == "WAVES"))
5971 then WAVES
6072 else if ((auctionAssetName == "BTC"))
6173 then wBTC
6274 else if ((auctionAssetName == "EUR"))
6375 then wEUR
6476 else if ((auctionAssetName == "USD"))
6577 then wUSD
66- else throw("Incorrect Asset Id")
78+ else if ((auctionAssetName == "AUCT"))
79+ then auctToken
80+ else throw("Incorrect Asset Id")
6781
6882
6983 func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime)
7084
7185
7286 func bidAmountCheck (amount,auctionPrice) = if ((amount > auctionPrice))
7387 then throw("Bid amount must be lower or equal than auctionPrice")
7488 else amount
7589
7690
7791 func increaseFreezedBalance (pmtAssetName,auctionPrice) = {
7892 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
7993 let currentFreezedBalance = match keyFreezedFunds {
8094 case a: Int =>
8195 a
8296 case _ =>
8397 0
8498 }
8599 (currentFreezedBalance + auctionPrice)
86100 }
87101
88102
89103 func decreaseFreezedBalance (pmtAssetName,auctionPrice) = {
90104 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
91105 let currentFreezedBalance = match keyFreezedFunds {
92106 case a: Int =>
93107 a
94108 case _ =>
95109 0
96110 }
97111 let a = (currentFreezedBalance - auctionPrice)
98112 if ((a >= 0))
99113 then a
100114 else throw("Freezed amount couldn't be less than 0")
101115 }
102116
103117
104-func freelancerIsRegistered (callerPub) = {
118+func clientRegistered (callerPub) = {
119+ let freelancerIsRegistered = getString(this, (callerPub + "_Freelancer"))
120+ match freelancerIsRegistered {
121+ case a: String =>
122+ callerPub
123+ case _ =>
124+ throw("Only registered users can make bets")
125+ }
126+ }
127+
128+
129+func freelancerRegistered (callerPub) = {
105130 let freelancerIsRegistered = getString(this, (callerPub + "_Freelancer"))
106131 match freelancerIsRegistered {
107132 case a: String =>
108133 callerPub
109134 case _ =>
110135 throw("Only registered users can make bets")
111136 }
112137 }
113138
114139
115140 func createAuctionPriceCheck (pmtAmount) = if ((pmtAmount > 0))
116141 then pmtAmount
117142 else throw("Amount must be higher then 0")
118143
119144
120145 func getAuctionState (auctionId) = {
121146 let valueState = getString(this, (auctionId + "_State"))
122147 match valueState {
123148 case a: String =>
124149 a
125150 case _ =>
126151 throw("Auction State was not found")
127152 }
128153 }
129154
130155
131156 func getAuctionClientPub (auctionId) = {
132- let valueClient = getString(this, (auctionId + "_AuctionClient"))
133- let clientPub = match valueClient {
157+ let valueClientPub = getString(this, (auctionId + "_AuctionClient"))
158+ match valueClientPub {
134159 case a: String =>
135160 a
136161 case _ =>
137162 throw("Auction Client was not found")
138163 }
139- fromBase58String(clientPub)
140164 }
141165
142166
143167 func getAuctionStartTime (auctionId) = {
144168 let valueAuctionStart = getInteger(this, (auctionId + "_AuctionStart"))
145169 match valueAuctionStart {
146170 case a: Int =>
147171 a
148172 case _ =>
149173 throw("Auction Start time was not found")
150174 }
151175 }
152176
153177
154178 func getAuctionDurationTime (auctionId) = {
155179 let valueauctionDuration = getInteger(this, (auctionId + "_AuctionDuration"))
156180 match valueauctionDuration {
157181 case a: Int =>
158182 a
159183 case _ =>
160184 throw("Auction duration time was not found")
161185 }
162186 }
163187
164188
165189 func getAuctionJobPerformanceTime (auctionId) = {
166190 let valueBlocksForExecution = getInteger(this, (auctionId + "_JobPerformance"))
167191 match valueBlocksForExecution {
168192 case a: Int =>
169193 a
170194 case _ =>
171195 throw("Auction job performance time was not found")
172196 }
173197 }
174198
175199
176200 func getAuctionAssetName (auctionId) = {
177201 let valueAssetName = getString(this, (auctionId + "_AssetName"))
178202 match valueAssetName {
179203 case a: String =>
180204 a
181205 case _ =>
182206 throw("Auction asset name was not found")
183207 }
184208 }
185209
186210
187211 func getAuctionPrice (auctionId) = {
188212 let valuePrice = getInteger(this, (auctionId + "_Price"))
189213 match valuePrice {
190214 case a: Int =>
191215 a
192216 case _ =>
193217 throw("Auction price was not found")
194218 }
195219 }
196220
197221
198222 func getAuctionFreelancerPub (auctionId) = {
199223 let valueClient = getString(this, (auctionId + "_HiredFreelancer"))
200- let a = match valueClient {
224+ match valueClient {
201225 case a: String =>
202226 a
203227 case _ =>
204228 throw("Auction Client was not found")
205229 }
206- fromBase58String(a)
230+ }
231+
232+
233+func getAuctionLowestBidder (auctionId) = {
234+ let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
235+ match valueLowestBidder {
236+ case a: String =>
237+ a
238+ case _ =>
239+ throw("Auction lowest bidder was not found")
240+ }
241+ }
242+
243+
244+func getBid (auctionId,auctionLowestBidder) = {
245+ let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
246+ match valueNewAuctionPrice {
247+ case a: Int =>
248+ a
249+ case _ =>
250+ throw("Auction lowest bid was not found")
251+ }
252+ }
253+
254+
255+func defineNewLowestBidder (auctionId,currentLowestBidderPub,bidAmount,newFreelancer) = {
256+ let valueCurrentLowestBid = getInteger(this, ((auctionId + "_Bid_") + currentLowestBidderPub))
257+ let currentLowestBid = match valueCurrentLowestBid {
258+ case a: Int =>
259+ a
260+ case _ =>
261+ throw("Auction lowest bid was not found")
262+ }
263+ if ((currentLowestBid > bidAmount))
264+ then newFreelancer
265+ else currentLowestBidderPub
266+ }
267+
268+
269+func choosedFreelancerCheck (auctionId,freelancerPub) = {
270+ let newFreelancer = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
271+ match newFreelancer {
272+ case a: Int =>
273+ freelancerPub
274+ case _ =>
275+ throw("Error: Incorrect freelancerPub")
276+ }
277+ }
278+
279+
280+func newExecutionTimeCheck (executionDays,auctionBlocksForExecution) = {
281+ let newAuctionBlocksForExecution = (executionDays * day)
282+ if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
283+ then newAuctionBlocksForExecution
284+ else throw("New execution time must more than current execution time")
285+ }
286+
287+
288+func getRating (auctionFreelancer) = {
289+ let valueRating = getInteger(this, (auctionFreelancer + "_Rating"))
290+ match valueRating {
291+ case a: Int =>
292+ a
293+ case _ =>
294+ 0
295+ }
296+ }
297+
298+
299+func callerIsAmbassador (callerPub) = if (if (if (if (if ((callerPub == ambassador1))
300+ then true
301+ else (callerPub == ambassador2))
302+ then true
303+ else (callerPub == ambassador3))
304+ then true
305+ else (callerPub == ambassador4))
306+ then true
307+ else (callerPub == ambassador5))
308+ then callerPub
309+ else throw("Only defined ambassadors can vote in disputes")
310+
311+
312+func ambassadorVoteCheck (auctionId,ambassadorPub,vote) = {
313+ let keyVoter = ((auctionId + "_DiputeVote_") + ambassadorPub)
314+ let valueVoter = getString(this, keyVoter)
315+ let ambassadorVoted = match valueVoter {
316+ case a: String =>
317+ true
318+ case _ =>
319+ false
320+ }
321+ if (ambassadorVoted)
322+ then throw("Ambassador voted already ")
323+ else if (if ((vote == client))
324+ then true
325+ else (vote == freelancer))
326+ then vote
327+ else throw(((("Vote is incorrect. Must be: " + client) + " or ") + freelancer))
328+ }
329+
330+
331+func getVotesNumber (auctionId) = {
332+ let valueVotesNumber = getInteger(this, (auctionId + "_DisputeVotes"))
333+ match valueVotesNumber {
334+ case a: Int =>
335+ a
336+ case _ =>
337+ throw("VotesNumber was not found")
338+ }
339+ }
340+
341+
342+func defineDisputeWinner (auctionId,newVote,auctionClient,auctionFreelancer) = {
343+ let ambassador1Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador1))
344+ let ambassador2Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador2))
345+ let ambassador3Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador3))
346+ let ambassador4Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador4))
347+ let ambassador5Vote = getString(this, ((auctionId + "_DiputeVote_") + ambassador5))
348+ let v1 = if ((ambassador1Vote == client))
349+ then 1
350+ else 0
351+ let v2 = if ((ambassador2Vote == client))
352+ then 1
353+ else 0
354+ let v3 = if ((ambassador3Vote == client))
355+ then 1
356+ else 0
357+ let v4 = if ((ambassador4Vote == client))
358+ then 1
359+ else 0
360+ let v5 = if ((ambassador5Vote == client))
361+ then 1
362+ else 0
363+ let currentVote = if ((newVote == client))
364+ then 1
365+ else 0
366+ let votesForClient = (((((v1 + v2) + v3) + v4) + v5) + currentVote)
367+ if ((votesForClient > 2))
368+ then auctionClient
369+ else auctionFreelancer
207370 }
208371
209372
210373 @Callable(i)
211374 func freelancerSignUp (info) = {
212375 let userPublicKey = toBase58String(i.callerPublicKey)
213376 let alreadyRegistered = getString(this, (userPublicKey + "_Freelancer"))
214377 if (isDefined(alreadyRegistered))
215378 then throw("User already registered")
216379 else WriteSet([DataEntry((userPublicKey + "_Freelancer"), info), DataEntry((userPublicKey + "_PendingEarnings"), 0), DataEntry((userPublicKey + "_PaidEarnings"), 0), DataEntry((userPublicKey + "_TotalEarnings"), 0), DataEntry((userPublicKey + "_JobsPending"), 0), DataEntry((userPublicKey + "_JobsCompleted"), 0), DataEntry((userPublicKey + "_JobsTotal"), 0)])
217380 }
218381
219382
220383
221384 @Callable(i)
222385 func clientSignUp (info) = {
223386 let userPublicKey = toBase58String(i.callerPublicKey)
224387 let alreadyRegistered = getString(this, (userPublicKey + "_Client"))
225388 if (isDefined(alreadyRegistered))
226389 then throw("User already registered")
227390 else WriteSet([DataEntry((userPublicKey + "_Client"), info), DataEntry((userPublicKey + "_JobsCreated"), 0), DataEntry((userPublicKey + "_JobsOnGoing"), 0), DataEntry((userPublicKey + "_JobInDispute"), 0)])
228391 }
229392
230393
231394
232395 @Callable(i)
233396 func createAuction (jobExecutionDays,auctionDurationDays,auctionInfo) = {
397+ let callerPub = toBase58String(i.callerPublicKey)
234398 let auctionId = toBase58String(i.transactionId)
235- let auctionClient = toBase58String(i.callerPublicKey)
399+ let auctionClient = clientRegistered(callerPub)
236400 let pmt = extract(i.payment)
237401 let pmtAmount = pmt.amount
238402 let auctionPrice = createAuctionPriceCheck(pmtAmount)
239403 let auctionStart = height
240404 let auctionDurationBlocks = (auctionDurationDays * day)
241405 let blocksForExecution = (jobExecutionDays * day)
242- let pmtAssetName = if (!(isDefined(pmt.assetId)))
243- then "WAVES"
244- else if ((pmt.assetId == wBTC))
245- then "BTC"
246- else if ((pmt.assetId == wEUR))
247- then "EUR"
248- else if ((pmt.assetId == wUSD))
249- then "USD"
250- else throw("AssetId is incorrect")
406+ let pmtAssetName = AssetIdToAssetName(pmt.assetId)
251407 let jobsCreated = getInt((auctionClient + "_JobsCreated"))
252408 let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
253409 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), DataEntry((auctionClient + "_JobsCreated"), (jobsCreated + 1))])
254410 }
255411
256412
257413
258414 @Callable(i)
259415 func makeBid (auctionId,amount) = {
260416 let callerPub = toBase58String(i.callerPublicKey)
261- let betTime = height
262417 let auctionState = getAuctionState(auctionId)
263418 let auctionClient = getAuctionClientPub(auctionId)
264419 let auctionStart = getAuctionStartTime(auctionId)
265420 let auctionDuration = getAuctionDurationTime(auctionId)
266421 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
267422 let auctionAssetName = getAuctionAssetName(auctionId)
268423 let auctionPrice = getAuctionPrice(auctionId)
269- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
270- let newFreelancer = freelancerIsRegistered(callerPub)
424+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
425+ let newFreelancer = freelancerRegistered(callerPub)
271426 let dAppCommission = ((auctionPrice * 3) / 100)
272427 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
273428 let bidAmount = bidAmountCheck(amount, auctionPrice)
274- let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
429+ let auctionTimeisOver = timeCheck(height, auctionStart, auctionDuration)
275430 if (auctionTimeisOver)
276431 then if ((auctionState == stateOpen))
277- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
432+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), (auctionPrice - dAppCommission), auctionAssetId58)]))
278433 else if ((auctionState == stateSuggested))
279434 then {
280- let auctionLowestBidder = {
281- let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
282- match valueLowestBidder {
283- case a: String =>
284- a
285- case _ =>
286- throw("Auction lowest bidder was not found")
287- }
288- }
289- let newAuctionPrice = {
290- let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
291- match valueNewAuctionPrice {
292- case a: Int =>
293- a
294- case _ =>
295- throw("Auction lowest bid was not found")
296- }
297- }
298- let amountDifference = ((auctionPrice - newAuctionPrice) - dAppCommission)
299- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
435+ let auctionLowestBidder = getAuctionLowestBidder(auctionId)
436+ let auctionLowestBid = getBid(auctionId, auctionLowestBidder)
437+ let amountDifference = ((auctionPrice - auctionLowestBid) - dAppCommission)
438+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), auctionLowestBid)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), amountDifference, auctionAssetId58)]))
300439 }
301440 else throw("Incorrect auction state")
302441 else if ((auctionState == stateOpen))
303442 then WriteSet([DataEntry(((auctionId + "_Bid_") + newFreelancer), bidAmount), DataEntry((auctionId + "_State"), stateSuggested), DataEntry((auctionId + "_LowestBidderPub"), callerPub)])
304443 else if ((auctionState == stateSuggested))
305444 then {
306- let currentLowestBidderPub = {
307- let lowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
308- match lowestBidder {
309- case a: String =>
310- a
311- case _ =>
312- throw("Auction lowest bidder was not found")
313- }
314- }
315- let newLowestBidderPub = {
316- let valueCurrentLowestBid = getInteger(this, ((auctionId + "_Bid_") + currentLowestBidderPub))
317- let currentLowestBid = match valueCurrentLowestBid {
318- case a: Int =>
319- a
320- case _ =>
321- throw("Auction lowest bid was not found")
322- }
323- if ((currentLowestBid > bidAmount))
324- then newFreelancer
325- else currentLowestBidderPub
326- }
445+ let currentLowestBidderPub = getAuctionLowestBidder(auctionId)
446+ let newLowestBidderPub = defineNewLowestBidder(auctionId, currentLowestBidderPub, bidAmount, newFreelancer)
327447 WriteSet([DataEntry((auctionId + "_LowestBidderPub"), newLowestBidderPub), DataEntry(((auctionId + "_Bid_") + newFreelancer), bidAmount)])
328448 }
329449 else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested))
330450 }
331451
332452
333453
334454 @Callable(i)
335455 func chooseFreelancer (auctionId,freelancerPub) = {
336- let callerPub = extract(i.callerPublicKey)
337- let betTime = height
456+ let callerPub = toBase58String(i.callerPublicKey)
338457 let auctionState = getAuctionState(auctionId)
339458 let auctionClient = getAuctionClientPub(auctionId)
340459 let auctionStart = getAuctionStartTime(auctionId)
341460 let auctionDuration = getAuctionDurationTime(auctionId)
342461 let auctionAssetName = getAuctionAssetName(auctionId)
343462 let auctionPrice = getAuctionPrice(auctionId)
344- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
345- let jobsOnGoing = getInt((toBase58String(auctionClient) + "_JobsOnGoing"))
463+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
464+ let newFreelancer = choosedFreelancerCheck(auctionId, freelancerPub)
465+ let freelancerBidAmount = getBid(auctionId, newFreelancer)
466+ let auctionTimeisOver = timeCheck(height, auctionStart, auctionDuration)
467+ let jobsOnGoing = getInt((auctionClient + "_JobsOnGoing"))
346468 let freelancerPendingEarnings = getInt((freelancerPub + "_PendingEarnings"))
347469 let freelancerTotalEarnings = getInt((freelancerPub + "_TotalEarnings"))
348- let freelancerBidAmount = {
349- let keyFreelancerBid = ((auctionId + "_Bid_") + freelancerPub)
350- let valueFreelacerBid = getInteger(this, keyFreelancerBid)
351- match valueFreelacerBid {
352- case a: Int =>
353- a
354- case _ =>
355- throw("Freelancer's bet was not found")
356- }
357- }
358- let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
359470 if ((callerPub == auctionClient))
360471 then if (auctionTimeisOver)
361472 then if ((auctionState == stateOpen))
362473 then {
363474 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
364475 let dAppCommission = ((auctionPrice * 3) / 100)
365- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (auctionPrice - dAppCommission), auctionAssetId58)]))
476+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), (auctionPrice - dAppCommission), auctionAssetId58)]))
366477 }
367478 else if ((auctionState == stateSuggested))
368479 then {
369- let auctionLowestBidder = {
370- let valueLowestBidder = getString(this, (auctionId + "_LowestBidderPub"))
371- match valueLowestBidder {
372- case a: String =>
373- a
374- case _ =>
375- throw("Auction lowest bidder was not found")
376- }
377- }
378- let newAuctionPrice = {
379- let valueNewAuctionPrice = getInteger(this, ((auctionId + "_Bid_") + auctionLowestBidder))
380- match valueNewAuctionPrice {
381- case a: Int =>
382- a
383- case _ =>
384- throw("Auction lowest bid was not found")
385- }
386- }
387- let amountDifference = (auctionPrice - newAuctionPrice)
480+ let auctionLowestBidder = getAuctionLowestBidder(auctionId)
481+ let auctionLowestBid = getBid(auctionId, auctionLowestBidder)
482+ let amountDifference = (auctionPrice - auctionLowestBid)
388483 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
389- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + newAuctionPrice)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + newAuctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountDifference, auctionAssetId58)]))
484+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), auctionLowestBidder), DataEntry((auctionId + "_Price"), auctionLowestBid), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + auctionLowestBid)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + auctionLowestBid))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), amountDifference, auctionAssetId58)]))
390485 }
391486 else throw("Incorrect auction state")
392487 else if (if ((auctionState == stateOpen))
393488 then true
394489 else (auctionState == stateSuggested))
395490 then {
396- let setNewFreelancer = {
397- let newFreelancer = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
398- match newFreelancer {
399- case a: Int =>
400- freelancerPub
401- case _ =>
402- throw("Error: Incorrect freelancerPub")
403- }
404- }
405- let newAuctionPrice = {
406- let freelancerBid = getInteger(this, ((auctionId + "_Bid_") + freelancerPub))
407- match freelancerBid {
408- case a: Int =>
409- a
410- case _ =>
411- throw("Auction lowest bidder was not found")
412- }
413- }
414491 let amountDifference = (auctionPrice - freelancerBidAmount)
415492 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, amountDifference)
416- ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), setNewFreelancer), DataEntry((auctionId + "_Price"), newAuctionPrice), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + newAuctionPrice)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + newAuctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), (amountDifference + 1), auctionAssetId58)]))
493+ ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateInProgress), DataEntry((auctionId + "_HiredFreelancer"), newFreelancer), DataEntry((auctionId + "_Price"), freelancerBidAmount), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsOnGoing"), (jobsOnGoing + 1)), DataEntry((freelancerPub + "_PendingEarnings"), (freelancerPendingEarnings + freelancerBidAmount)), DataEntry((freelancerPub + "_TotalEarnings"), (freelancerTotalEarnings + freelancerBidAmount))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), (amountDifference + 1), auctionAssetId58)]))
417494 }
418495 else throw("Incorrect auction state")
419496 else throw("Only auction customer can choose a freelancer")
420497 }
421498
422499
423500
424501 @Callable(i)
425502 func increaseExecutionTime (auctionId,executionDays) = {
426- let caller = extract(i.callerPublicKey)
503+ let caller = toBase58String(i.callerPublicKey)
427504 let auctionState = getAuctionState(auctionId)
428505 let auctionClient = getAuctionClientPub(auctionId)
429506 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
430- let newAuctionExecutionTime = {
431- let newAuctionBlocksForExecution = (executionDays * day)
432- if ((newAuctionBlocksForExecution > auctionBlocksForExecution))
433- then newAuctionBlocksForExecution
434- else throw("New execution time must more than current execution time")
435- }
507+ let newAuctionExecutionTime = newExecutionTimeCheck(executionDays, auctionBlocksForExecution)
436508 if ((caller == auctionClient))
437509 then if (if (if ((auctionState == stateOpen))
438510 then true
439511 else (auctionState == stateSuggested))
440512 then true
441513 else (auctionState == stateInProgress))
442514 then WriteSet([DataEntry((auctionId + "_JobPerformance"), newAuctionExecutionTime)])
443515 else throw("Incorrect state")
444516 else throw("Only Client can increase execution time")
445517 }
446518
447519
448520
449521 @Callable(i)
450522 func cancelAuction (auctionId) = {
451- let callerPub = extract(i.callerPublicKey)
523+ let callerPub = toBase58String(i.callerPublicKey)
452524 let auctionState = getAuctionState(auctionId)
453525 let auctionClient = getAuctionClientPub(auctionId)
454526 let auctionAssetName = getAuctionAssetName(auctionId)
455527 let auctionPrice = getAuctionPrice(auctionId)
456- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
528+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
457529 let dAppCommission = ((auctionPrice * 3) / 100)
458530 let amountWithoutComm = (auctionPrice - dAppCommission)
459531 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
460532 if ((callerPub == auctionClient))
461533 then if ((auctionState == stateOpen))
462- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionClient), amountWithoutComm, auctionAssetId58)]))
534+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateCancel), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionClient)), amountWithoutComm, auctionAssetId58)]))
463535 else throw("Auction can be canceled only by auction owner.")
464536 else throw("Only Client can cancel auction")
465537 }
466538
467539
468540
469541 @Callable(i)
470542 func openDispute (auctionId) = {
471- let caller = extract(i.callerPublicKey)
543+ let caller = toBase58String(i.callerPublicKey)
472544 let auctionState = getAuctionState(auctionId)
473545 let auctionClient = getAuctionClientPub(auctionId)
474546 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
475- let clientJobsInDispute = getInt((toBase58String(auctionClient) + "_JobsInDispute"))
547+ let clientJobsInDispute = getInt((auctionClient + "_JobsInDispute"))
476548 if (if ((auctionState == stateInProgress))
477549 then true
478550 else (auctionState == stateWait4Confirm))
479551 then if (if ((caller == auctionClient))
480552 then true
481553 else (caller == auctionFreelancer))
482- then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), 0), DataEntry((toBase58String(auctionClient) + "_JobsInDispute"), (clientJobsInDispute + 1))])
554+ then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), 0), DataEntry((auctionClient + "_JobsInDispute"), (clientJobsInDispute + 1))])
483555 else throw("Only Client and Freelancer can open dispute")
484556 else throw("Incorrect auction state for dispute opening")
485557 }
486558
487559
488560
489561 @Callable(i)
490562 func voteDispute (auctionId,vote) = {
491- let callerPub = extract(i.callerPublicKey)
563+ let callerPub = toBase58String(i.callerPublicKey)
492564 let auctionState = getAuctionState(auctionId)
493565 let auctionClient = getAuctionClientPub(auctionId)
494566 let auctionAssetName = getAuctionAssetName(auctionId)
495567 let auctionPrice = getAuctionPrice(auctionId)
496568 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
497569 let commission = ((auctionPrice * 3) / 100)
498- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
499- let clientJobsInDispute = getInt((toBase58String(auctionClient) + "_JobsInDispute"))
500- let freelancerPendingEarnings = getInt((toBase58String(auctionFreelancer) + "_PendingEarnings"))
501- let callerIsAmbassador = if (if (if (if (if ((callerPub == ambassador1))
502- then true
503- else (callerPub == ambassador2))
504- then true
505- else (callerPub == ambassador3))
506- then true
507- else (callerPub == ambassador4))
508- then true
509- else (callerPub == ambassador5))
510- then toBase58String(callerPub)
511- else throw("Only defined ambassadors can vote in disputes")
512- let newVote = if (if ((vote == client))
513- then true
514- else (vote == freelancer))
515- then vote
516- else throw(((("Vote is incorrect. Must be: " + client) + " or ") + freelancer))
517- let newVoter = {
518- let keyVoter = ((auctionId + "_DiputeVote_") + callerIsAmbassador)
519- let valueVoter = getString(this, keyVoter)
520- match valueVoter {
521- case a: String =>
522- throw("User already voted")
523- case _ =>
524- callerIsAmbassador
525- }
526- }
527- let votesNumber = {
528- let valueVotesNumber = getInteger(this, (auctionId + "_DisputeVotes"))
529- match valueVotesNumber {
530- case a: Int =>
531- a
532- case _ =>
533- throw("VotesNumber was not found")
534- }
535- }
570+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
571+ let ambassadorPub = callerIsAmbassador(callerPub)
572+ let ambassadorVote = ambassadorVoteCheck(auctionId, ambassadorPub, vote)
573+ let votesNumber = getVotesNumber(auctionId)
574+ let clientJobsInDispute = getInt((auctionClient + "_JobsInDispute"))
575+ let freelancerPendingEarnings = getInt((auctionFreelancer + "_PendingEarnings"))
576+ let freelancerTotalEarnings = getInt((auctionFreelancer + "_TotalEarnings"))
536577 if ((auctionState == stateDispute))
537578 then if ((votesNumber == 4))
538579 then {
539- let disputeWinner = {
540- let ambassador1Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador1)))
541- let ambassador2Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador2)))
542- let ambassador3Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador3)))
543- let ambassador4Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador4)))
544- let ambassador5Vote = getString(this, ((auctionId + "_DiputeVote_") + toBase58String(ambassador5)))
545- let v1 = if ((ambassador1Vote == client))
546- then 1
547- else 0
548- let v2 = if ((ambassador2Vote == client))
549- then 1
550- else 0
551- let v3 = if ((ambassador3Vote == client))
552- then 1
553- else 0
554- let v4 = if ((ambassador4Vote == client))
555- then 1
556- else 0
557- let v5 = if ((ambassador5Vote == client))
558- then 1
559- else 0
560- let currentVote = if ((newVote == client))
561- then 1
562- else 0
563- let votesForClient = (((((v1 + v2) + v3) + v4) + v5) + currentVote)
564- if ((votesForClient > 2))
565- then auctionClient
566- else auctionFreelancer
567- }
568- let paymentWithoutComm = if ((disputeWinner == auctionClient))
569- then (auctionPrice - commission)
570- else (auctionPrice - (commission * 2))
580+ let disputeWinnerPub = defineDisputeWinner(auctionId, ambassadorVote, auctionClient, auctionFreelancer)
571581 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
572- ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + newVoter), newVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsInDispute"), (clientJobsInDispute - 1)), DataEntry((toBase58String(auctionFreelancer) + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(disputeWinner), paymentWithoutComm, auctionAssetId58)]))
582+ if ((disputeWinnerPub == auctionClient))
583+ then {
584+ let paymentWithoutComm = (auctionPrice - commission)
585+ ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + ambassadorPub), ambassadorVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsInDispute"), (clientJobsInDispute - 1)), DataEntry((auctionFreelancer + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice)), DataEntry((auctionFreelancer + "_TotalEarnings"), (freelancerTotalEarnings - auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(disputeWinnerPub)), paymentWithoutComm, auctionAssetId58)]))
586+ }
587+ else {
588+ let paymentWithoutComm = (auctionPrice - (commission * 2))
589+ ScriptResult(WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry((auctionId + "_State"), stateDisputeResolved), DataEntry(((auctionId + "_DiputeVote_") + ambassadorPub), ambassadorVote), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsInDispute"), (clientJobsInDispute - 1)), DataEntry((auctionFreelancer + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(disputeWinnerPub)), paymentWithoutComm, auctionAssetId58)]))
590+ }
573591 }
574- else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + newVoter), newVote)])
592+ else WriteSet([DataEntry((auctionId + "_DisputeVotes"), (votesNumber + 1)), DataEntry(((auctionId + "_DiputeVote_") + ambassadorPub), ambassadorVote)])
575593 else throw(("Incorrect state. Must be: " + stateDispute))
576594 }
577595
578596
579597
580598 @Callable(i)
581599 func workHandOver (auctionId) = {
582- let callerPub = extract(i.callerPublicKey)
600+ let callerPub = toBase58String(i.callerPublicKey)
583601 let auctionState = getAuctionState(auctionId)
584602 let auctionClient = getAuctionClientPub(auctionId)
585603 let auctionStart = getAuctionStartTime(auctionId)
586604 let auctionDuration = getAuctionDurationTime(auctionId)
587605 let auctionBlocksForExecution = getAuctionJobPerformanceTime(auctionId)
588606 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
589- let clientJobsInDispute = getInt((toBase58String(auctionClient) + "_JobsInDispute"))
590- let currentTime = height
591- let freelancerPubCheck = if ((callerPub == auctionFreelancer))
592- then callerPub
607+ let timeIsOver = ((height - auctionStart) > auctionBlocksForExecution)
608+ let clientJobsInDispute = getInt((auctionClient + "_JobsInDispute"))
609+ if ((callerPub == auctionFreelancer))
610+ then if ((auctionState == stateInProgress))
611+ then if (timeIsOver)
612+ then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0"), DataEntry((auctionClient + "_JobInDispute"), (clientJobsInDispute + 1))])
613+ else WriteSet([DataEntry((auctionId + "_State"), stateWait4Confirm)])
614+ else throw("Auction state is incorrect")
593615 else throw("Only a freelancer can indicate that the work is done")
594- let timeIsOver = ((currentTime - auctionStart) > auctionBlocksForExecution)
595- if ((auctionState == stateInProgress))
596- then if (timeIsOver)
597- then WriteSet([DataEntry((auctionId + "_State"), stateDispute), DataEntry((auctionId + "_DisputeVotes"), "0"), DataEntry((toBase58String(auctionClient) + "_JobInDispute"), (clientJobsInDispute + 1))])
598- else WriteSet([DataEntry((auctionId + "_State"), stateWait4Confirm)])
599- else throw("Auction state is incorrect")
600616 }
601617
602618
603619
604620 @Callable(i)
605621 func acceptWork (auctionId) = {
606- let callerPub = extract(i.callerPublicKey)
622+ let callerPub = toBase58String(i.callerPublicKey)
607623 let auctionState = getAuctionState(auctionId)
608624 let auctionClient = getAuctionClientPub(auctionId)
609625 let auctionStart = getAuctionStartTime(auctionId)
610626 let auctionDuration = getAuctionDurationTime(auctionId)
611627 let auctionAssetName = getAuctionAssetName(auctionId)
612628 let auctionPrice = getAuctionPrice(auctionId)
613629 let auctionFreelancer = getAuctionFreelancerPub(auctionId)
614- let jobsOnGoing = getInt((toBase58String(auctionClient) + "_JobsOnGoing"))
615- let freelancerPendingEarnings = getInt((toBase58String(auctionFreelancer) + "_PendingEarnings"))
616- let freelancerPaidEarnings = getInt((toBase58String(auctionFreelancer) + "_PaidEarnings"))
630+ let jobsOnGoing = getInt((auctionClient + "_JobsOnGoing"))
631+ let freelancerPendingEarnings = getInt((auctionFreelancer + "_PendingEarnings"))
632+ let freelancerPaidEarnings = getInt((auctionFreelancer + "_PaidEarnings"))
617633 let dAppCommission = ((auctionPrice * 3) / 100)
618- let amountWithoutComm = (auctionPrice - dAppCommission)
619- let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
634+ let amountWithoutComm = (auctionPrice - (dAppCommission * 2))
635+ let auctionAssetId58 = AssetNameToAssetId(auctionAssetName)
620636 let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
621- let newRating = {
622- let valueRating = getInteger(this, (toBase58String(auctionFreelancer) + "_Rating"))
623- let currentRating = match valueRating {
624- case a: Int =>
625- a
626- case _ =>
627- 0
628- }
629- (currentRating + 1)
630- }
637+ let freelancerRating = getRating(auctionFreelancer)
631638 if ((callerPub == auctionClient))
632639 then if ((auctionState == stateWait4Confirm))
633- then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((toBase58String(auctionFreelancer) + "_Rating"), newRating), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((toBase58String(auctionClient) + "_JobsOnGoing"), (jobsOnGoing - 1)), DataEntry((toBase58String(auctionFreelancer) + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice)), DataEntry((toBase58String(auctionFreelancer) + "_PaidEarnings"), (freelancerPaidEarnings + auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionFreelancer), amountWithoutComm, auctionAssetId58)]))
640+ then ScriptResult(WriteSet([DataEntry((auctionId + "_State"), stateComplete), DataEntry((auctionFreelancer + "_Rating"), (freelancerRating + 1)), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance), DataEntry((auctionClient + "_JobsOnGoing"), (jobsOnGoing - 1)), DataEntry((auctionFreelancer + "_PendingEarnings"), (freelancerPendingEarnings - auctionPrice)), DataEntry((auctionFreelancer + "_PaidEarnings"), (freelancerPaidEarnings + auctionPrice))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionFreelancer)), amountWithoutComm, auctionAssetId58)]))
634641 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
635642 else throw("Only auction customer can use this function")
636643 }
637644
638645
639646 @Verifier(tx)
640647 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
641648 then match tx {
642649 case ttx: TransferTransaction =>
643- true
650+ let assetName = AssetIdToAssetName(ttx.assetId)
651+ let valueReservedBalance = getInteger(this, (assetName + "_Reserved"))
652+ let reservedBalance = match valueReservedBalance {
653+ case a: Int =>
654+ a
655+ case _ =>
656+ 0
657+ }
658+ let availableBalance = (assetBalance(this, ttx.assetId) - reservedBalance)
659+ (availableBalance >= ttx.amount)
644660 case stx: SetScriptTransaction =>
645661 true
646662 case _ =>
647663 false
648664 }
649665 else false
650666

github/deemru/w8io/873ac7e 
96.56 ms