tx · CELRGYBHp7rymFnbB5mrNQuEznF64AbNmaCm7zzytQ6G 3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2: -0.01500000 Waves 2019.09.05 20:51 [663058] smart account 3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2 > SELF 0.00000000 Waves
{ "type": 13, "id": "CELRGYBHp7rymFnbB5mrNQuEznF64AbNmaCm7zzytQ6G", "fee": 1500000, "feeAssetId": null, "timestamp": 1567705901898, "version": 1, "sender": "3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2", "senderPublicKey": "8y2Uc9uYf5gRD6Dzm1aC73zYe3LZvtVDUVAnAhNdN2mg", "proofs": [ "3UvGkCLm2xzxssbkXQHLEto8KdAj5KMGJW3DSTMHysxz8N5Lz1XdYLcDouLmdRA4dDPD5yTcRjApUjcuzo5UogtY" ], "script": "base64:AAIDAAAAAAAAAAAAAAAdAAAAAAthdWN0aW9uVGltZQAAAAAAAAAQ4AAAAAADZGF5AAAAAAAAAAWgAAAAAAljb21pc3Npb24AAAAAAAAAAAMAAAAABVdBVkVTBQAAAAR1bml0AAAAAAR3QlRDAQAAACBs+mr/xe2qjAt/tSqT0qIML4KC23R6BIxT+/0TH3Og/wAAAAAEd0VVUgEAAAAg7BZhBF97kSFBBjs38+fX1Pjz08YOqoCX85C/0PoVupkAAAAABHdVU0QBAAAAIN0cvQHwz3UFMHgHsqi2OJjRRd1cH7ozWuNAb/pmWXD9AAAAAAlzdGF0ZU9wZW4CAAAABk9wZW5lZAAAAAAOc3RhdGVTdWdnZXN0ZWQCAAAACVN1Z2dlc3RlZAAAAAALc3RhdGVDYW5jZWwCAAAACENhbmNlbGVkAAAAAA9zdGF0ZUluUHJvZ3Jlc3MCAAAACkluUHJvZ3Jlc3MAAAAAEXN0YXRlV2FpdDRDb25maXJtAgAAABNXYWl0Rm9yQ29uZmlybWF0aW9uAAAAAA1zdGF0ZUNvbXBsZXRlAgAAAAlDb21wbGV0ZWQAAAAADHN0YXRlRGlzcHV0ZQIAAAAHRGlzcHV0ZQAAAAAUc3RhdGVEaXNwdXRlUmVzb2x2ZWQCAAAAD0Rpc3B1dGVSZXNvbHZlZAAAAAAIY3VzdG9tZXICAAAAA0NNUgAAAAAKZnJlZWxhbmNlcgIAAAACRkwAAAAAC2FtYmFzc2Fkb3IxAQAAAAEAAAAAAAthbWJhc3NhZG9yMgEAAAABAAAAAAALYW1iYXNzYWRvcjMBAAAAAQAAAAAAC2FtYmFzc2Fkb3I0AQAAAAEAAAAAAAthbWJhc3NhZG9yNQEAAAABAAEAAAALZ2V0RGF0YUxpc3QAAAABAAAACWF1Y3Rpb25JZAQAAAANZ2V0RGF0YVN0cmluZwkABB0AAAACBQAAAAR0aGlzBQAAAAlhdWN0aW9uSWQEAAAAAWEEAAAAByRtYXRjaDAFAAAADWdldERhdGFTdHJpbmcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABdBdWN0aW9uSWQgd2FzIG5vdCBmb3VuZAkABLUAAAACBQAAAAFhAgAAAAFfAQAAABJnZXREaXNwdXRlRGF0YUxpc3QAAAABAAAACWF1Y3Rpb25JZAQAAAAOa2V5RGlzcHV0ZURhdGEJAAEsAAAAAgkAASwAAAACBQAAAAlhdWN0aW9uSWQCAAAAAV8FAAAADHN0YXRlRGlzcHV0ZQQAAAAUZ2V0RGlzcHV0ZURhdGFTdHJpbmcJAAQdAAAAAgUAAAAEdGhpcwUAAAAOa2V5RGlzcHV0ZURhdGEEAAAAAWEEAAAAByRtYXRjaDAFAAAAFGdldERpc3B1dGVEYXRhU3RyaW5nAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAaRGlzcHV0ZSBkYXRhIHdhcyBub3QgZm91bmQJAAS1AAAAAgUAAAABYQIAAAABLwEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABAAAAEGF1Y3Rpb25Bc3NldE5hbWUDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAABVdBVkVTBQAAAAVXQVZFUwMJAAAAAAAAAgUAAAAQYXVjdGlvbkFzc2V0TmFtZQIAAAADQlRDBQAAAAR3QlRDAwkAAAAAAAACBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAANFVVIFAAAABHdFVVIDCQAAAAAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUCAAAAA1VTRAUAAAAEd1VTRAkAAAIAAAABAgAAABJJbmNvcnJlY3QgQXNzZXQgSWQBAAAADWJldFByaWNlQ2hlY2sAAAACAAAACGJldFByaWNlAAAADGF1Y3Rpb25QcmljZQMJAABmAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAAhiZXRQcmljZQUAAAAIYmV0UHJpY2UJAAACAAAAAQkAASwAAAACAgAAADlCZXQgcHJpY2UgbXVzdCBiZSBsb3dlciB0aGFuIGFjdHVhbCBwcmljZS4gQWN0dWFsIHByaWNlOiAJAAGkAAAAAQUAAAAMYXVjdGlvblByaWNlAQAAAAl0aW1lQ2hlY2sAAAADAAAAC2N1cnJlbnRUaW1lAAAACXN0YXJ0VGltZQAAAA5leHBpcmF0aW9uVGltZQkAAGYAAAACCQAAZQAAAAIFAAAAC2N1cnJlbnRUaW1lBQAAAAlzdGFydFRpbWUFAAAADmV4cGlyYXRpb25UaW1lAQAAAAtmcmVlemVGdW5kcwAAAAMAAAAMcG10QXNzZXROYW1lAAAADGF1Y3Rpb25QcmljZQAAAA5kQXBwQ29tbWlzc2lvbgQAAAAPa2V5RnJlZXplZEZ1bmRzCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAMcG10QXNzZXROYW1lAgAAAAhfRnJlZXplZAQAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBAAAAAckbWF0Y2gwBQAAAA9rZXlGcmVlemVkRnVuZHMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAkAAGUAAAACCQAAZAAAAAIFAAAAFWN1cnJlbnRGcmVlemVkQmFsYW5jZQUAAAAMYXVjdGlvblByaWNlBQAAAA5kQXBwQ29tbWlzc2lvbgEAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAAAAAEAAAAGY2FsbGVyBAAAABZmcmVlbGFuY2VySXNSZWdpc3RlcmVkCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAGY2FsbGVyAgAAAAdfU3RhdHVzBAAAAAckbWF0Y2gwBQAAABZmcmVlbGFuY2VySXNSZWdpc3RlcmVkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAjT25seSByZWdpc3RlcmVkIHVzZXJzIGNhbiBtYWtlIGJldHMAAAAJAAAAAWkBAAAABnNpZ25VcAAAAAEAAAAEaW5mbwQAAAANdXNlclB1YmxpY0tleQkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAANdXNlclB1YmxpY0tleQIAAAALX1JlZ2lzdGVyZWQDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAACAAAAAQIAAAAXVXNlciBhbHJlYWR5IHJlZ2lzdGVyZWQJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkB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LAAAAAICAAAAE1BheW1lbnQgbXVzdCBiZSBpbiAFAAAAEGF1Y3Rpb25Bc3NldE5hbWUAAAABaQEAAAAVaW5jcmVhc2VFeGVjdXRpb25UaW1lAAAAAgAAAAlhdWN0aW9uSWQAAAANZXhlY3V0aW9uRGF5cwQAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAPYXVjdGlvbkRhdGFMaXN0CQEAAAALZ2V0RGF0YUxpc3QAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGF0ZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAAEAAAAD2F1Y3Rpb25DdXN0b21lcgkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAEEAAAAFGF1Y3Rpb25FeGVjdXRpb25UaW1lCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAADBAAAABduZXdBdWN0aW9uRXhlY3V0aW9uVGltZQQAAAAQbmV3RXhlY3V0aW9uVGltZQkAAGgAAAACBQAAAA1leGVjdXRpb25EYXlzBQAAAANkYXkDCQAAZgAAAAIFAAAAEG5ld0V4ZWN1dGlvblRpbWUFAAAAFGF1Y3Rpb25FeGVjdXRpb25UaW1lBQAAABBuZXdFeGVjdXRpb25UaW1lCQAAAgAAAAECAAAAOE5ldyBleGVjdXRpb24gdGltZSBtdXN0IG1vcmUgdGhhbiBjdXJyZW50IGV4ZWN1dGlvbiB0aW1lAwkAAAAAAAACBQAAAAZjYWxsZXIFAAAAD2F1Y3Rpb25DdXN0b21lcgMDAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgYJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA5zdGF0ZVN1Z2dlc3RlZAYJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAA9zdGF0ZUluUHJvZ3Jlc3MEAAAADW5ld0RhdGFTdHJpbmcJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQIAAAABXwUAAAAPYXVjdGlvbkN1c3RvbWVyAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAgIAAAABXwkAAaQAAAABBQAAABduZXdBdWN0aW9uRXhlY3V0aW9uVGltZQIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAQCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAFAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJYXVjdGlvbklkBQAAAA1uZXdEYXRhU3RyaW5nBQAAAANuaWwJAAACAAAAAQIAAAAPSW5jb3JyZWN0IHN0YXRlCQAAAgAAAAECAAAAKU9ubHkgY3VzdG9tZXIgY2FuIGluY3JlYXNlIGV4ZWN1dGlvbiB0aW1lAAAAAWkBAAAADWNhbmNlbEF1Y3Rpb24AAAABAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkRhdGFMaXN0CQEAAAALZ2V0RGF0YUxpc3QAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGF0ZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAAEAAAAD2F1Y3Rpb25DdXN0b21lcgkAAlkAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAQQAAAATYXVjdGlvbklkT3duZXJDaGVjawMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA9hdWN0aW9uQ3VzdG9tZXIGCQAAAgAAAAECAAAAJkF1Y3Rpb24gY2FuIGJlIGNhbmNlbGVkIG9ubHkgYnkgb3duZXIuAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgQAAAAKZGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAABAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAgIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAMCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAEAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABQkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJYXVjdGlvbklkCQABLAAAAAIJAAEsAAAAAgUAAAALc3RhdGVDYW5jZWwCAAAAAV8FAAAACmRhdGFTdHJpbmcFAAAAA25pbAkAAAIAAAABAgAAABhJbmNvcnJlY3QgYXVjdGlvbiBzdGF0ZS4AAAABaQEAAAALb3BlbkRpc3B1dGUAAAABAAAACWF1Y3Rpb25JZAQAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAPYXVjdGlvbkRhdGFMaXN0CQEAAAALZ2V0RGF0YUxpc3QAAAABBQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25TdGF0ZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAAEAAAAD2F1Y3Rpb25DdXN0b21lcgkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAEEAAAAEWF1Y3Rpb25GcmVlbGFuY2VyCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABgMDCQAAAAAAAAIFAAAABmNhbGxlcgUAAAAPYXVjdGlvbkN1c3RvbWVyBgkAAAAAAAACBQAAAAZjYWxsZXIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyBAAAAApkYXRhU3RyaW5nAgAAAAExCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAlhdWN0aW9uSWQJAAEsAAAAAgUAAAAMc3RhdGVEaXNwdXRlBQAAAApkYXRhU3RyaW5nCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAACWF1Y3Rpb25JZAIAAAAIX0Rpc3B1dGUCAAAAATAFAAAAA25pbAkAAAIAAAABAgAAAC1Pbmx5IGN1c3RvbWVyIGFuZCBmcmVlbGFuY2VyIGNhbiBvcGVuIGRpc3B1dGUAAAABaQEAAAALdm90ZURpc3B1dGUAAAACAAAACWF1Y3Rpb25JZAAAAAR2b3RlBAAAAA9hdWN0aW9uRGF0YUxpc3QJAQAAAAtnZXREYXRhTGlzdAAAAAEFAAAACWF1Y3Rpb25JZAQAAAARYXVjdGlvblN0YXRlQ2hlY2sEAAAADGF1Y3Rpb25TdGF0ZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAADCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAMc3RhdGVEaXNwdXRlBgkAAAIAAAABCQABLAAAAAICAAAAGkluY29ycmVjdCBzdGF0ZS4gTXVzdCBiZTogBQAAAAxzdGF0ZURpc3B1dGUEAAAADmF1Y3Rpb25Bc3NldElkCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABAQAAAAMYXVjdGlvblByaWNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAFBAAAAAduZXdWb3RlAwMJAAAAAAAAAgUAAAAEdm90ZQUAAAAIY3VzdG9tZXIGCQAAAAAAAAIFAAAABHZvdGUFAAAACmZyZWVsYW5jZXIFAAAABHZvdGUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAcVm90ZSBpcyBpbmNvcnJlY3QuIE11c3QgYmU6IAUAAAAIY3VzdG9tZXICAAAABCBvciAFAAAACmZyZWVsYW5jZXIEAAAACG5ld1ZvdGVyAwMDAwMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAthbWJhc3NhZG9yMQYJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAthbWJhc3NhZG9yMgYJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAthbWJhc3NhZG9yMwYJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAthbWJhc3NhZG9yNAYJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAAthbWJhc3NhZG9yNQkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAApWW91IGhhdmUgbm8gcmlnaHRzIGZvciBkaXNwdXRlcyByZXNvbHZpbmcEAAAAC2Rpc3B1dGVEYXRhBAAAAAprZXlEaXNwdXRlCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAFfBQAAAAxzdGF0ZURpc3B1dGUEAAAADHZhbHVlRGlzcHV0ZQkABB0AAAACBQAAAAR0aGlzBQAAAAprZXlEaXNwdXRlBAAAAAckbWF0Y2gwBQAAAAx2YWx1ZURpc3B1dGUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAACZDYW5ub3QgZmluZCBkYXRhIG9mIGRpc3B1dGUgaW4gc3RvcmFnZQQAAAAPZGlzcHV0ZURhdGFMaXN0CQAEtQAAAAIFAAAAC2Rpc3B1dGVEYXRhAgAAAAEvBAAAAAx2b3Rlc0NvdW50ZXIJAAGRAAAAAgUAAAAPZGlzcHV0ZURhdGFMaXN0AAAAAAAAAAAAAwkAAAAAAAACBQAAAAx2b3Rlc0NvdW50ZXICAAAAATQEAAAACnZvdGVyc0xpc3QJAAS1AAAAAgkAAZEAAAACBQAAAA9kaXNwdXRlRGF0YUxpc3QAAAAAAAAAAAECAAAAAV8EAAAACXZvdGVzTGlzdAkABLUAAAACCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAgIAAAABXwQAAAAMYWxyZWFkeVZvdGVkAwkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAAABgkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAABAwUAAAAMYWxyZWFkeVZvdGVkCQAAAgAAAAECAAAAEVlvdSBhbHJlYWR5IHZvdGVkBAAAAA9uZXdWb3Rlc0NvdW50ZXICAAAAATUEAAAACW5ld1ZvdGVycwkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAPZGlzcHV0ZURhdGFMaXN0AAAAAAAAAAABAgAAAAFfBQAAAAhuZXdWb3RlcgQAAAAIbmV3Vm90ZXMJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAgIAAAABXwUAAAAHbmV3Vm90ZQQAAAAUbmV3RGlzcHV0ZURhdGFTdHJpbmcJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAPbmV3Vm90ZXNDb3VudGVyAgAAAAEvBQAAAAluZXdWb3RlcnMCAAAAAS8FAAAACG5ld1ZvdGVzBAAAAA1kaXNwdXRlV2lubmVyBAAAAAV2b3RlMQMJAAAAAAAAAgkAAZEAAAACBQAAAAl2b3Rlc0xpc3QAAAAAAAAAAAAFAAAACGN1c3RvbWVyAAAAAAAAAAABAAAAAAAAAAAABAAAAAV2b3RlMgMJAAAAAAAAAgkAAZEAAAACBQAAAAl2b3Rlc0xpc3QAAAAAAAAAAAEFAAAACGN1c3RvbWVyAAAAAAAAAAABAAAAAAAAAAAABAAAAAV2b3RlMwMJAAAAAAAAAgkAAZEAAAACBQAAAAl2b3Rlc0xpc3QAAAAAAAAAAAIFAAAACGN1c3RvbWVyAAAAAAAAAAABAAAAAAAAAAAABAAAAAV2b3RlNAMJAAAAAAAAAgkAAZEAAAACBQAAAAl2b3Rlc0xpc3QAAAAAAAAAAAMFAAAACGN1c3RvbWVyAAAAAAAAAAABAAAAAAAAAAAABAAAAAV2b3RlNQMJAAAAAAAAAgUAAAAHbmV3Vm90ZQUAAAAIY3VzdG9tZXIAAAAAAAAAAAEAAAAAAAAAAAAEAAAADWN1c3RvbWVyVm90ZXMJAABkAAAAAgkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgUAAAAFdm90ZTEFAAAABXZvdGUyBQAAAAV2b3RlMwUAAAAFdm90ZTQFAAAABXZvdGU1AwkAAGYAAAACBQAAAA1jdXN0b21lclZvdGVzAAAAAAAAAAACBQAAAAhjdXN0b21lcgUAAAAKZnJlZWxhbmNlcgQAAAANbmV3RGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAQIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAICAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAADAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABAIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAUCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAGBAAAABREaXNwdXRlV2lubmVyQWRkcmVzcwMJAAAAAAAAAgUAAAANZGlzcHV0ZVdpbm5lcgUAAAAIY3VzdG9tZXIJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABgQAAAARYW1vdW50V2l0aG91dENvbW0JAABlAAAAAgUAAAAMYXVjdGlvblByaWNlCQAAaQAAAAIJAABoAAAAAgUAAAAMYXVjdGlvblByaWNlAAAAAAAAAAADAAAAAAAAAABkCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJYXVjdGlvbklkCQABLAAAAAIFAAAAFHN0YXRlRGlzcHV0ZVJlc29sdmVkBQAAAA1uZXdEYXRhU3RyaW5nCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAFfBQAAAAxzdGF0ZURpc3B1dGUFAAAAFG5ld0Rpc3B1dGVEYXRhU3RyaW5nBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAABREaXNwdXRlV2lubmVyQWRkcmVzcwUAAAARYW1vdW50V2l0aG91dENvbW0JAAJZAAAAAQUAAAAOYXVjdGlvbkFzc2V0SWQFAAAAA25pbAQAAAAUbmV3RGlzcHV0ZURhdGFTdHJpbmcDCQAAAAAAAAIFAAAADHZvdGVzQ291bnRlcgIAAAABMAQAAAAPbmV3Vm90ZXNDb3VudGVyAgAAAAExBAAAAAluZXdWb3RlcnMFAAAACG5ld1ZvdGVyBAAAAAhuZXdWb3RlcwUAAAAHbmV3Vm90ZQQAAAANbmV3RGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA9uZXdWb3Rlc0NvdW50ZXICAAAAAS8FAAAACW5ld1ZvdGVycwIAAAABLwUAAAAIbmV3Vm90ZXMFAAAADW5ld0RhdGFTdHJpbmcDCQAAAAAAAAIFAAAADHZvdGVzQ291bnRlcgIAAAABMQQAAAAGdm90ZXIxCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAQQAAAAFdm90ZTEJAAGRAAAAAgUAAAAPZGlzcHV0ZURhdGFMaXN0AAAAAAAAAAACBAAAAAxhbHJlYWR5Vm90ZWQJAAAAAAAAAgUAAAAIbmV3Vm90ZXIFAAAABnZvdGVyMQMFAAAADGFscmVhZHlWb3RlZAkAAAIAAAABAgAAABFZb3UgYWxyZWFkeSB2b3RlZAQAAAAPbmV3Vm90ZXNDb3VudGVyAgAAAAExBAAAAAluZXdWb3RlcnMJAAEsAAAAAgUAAAAGdm90ZXIxBQAAAAhuZXdWb3RlcgQAAAAIbmV3Vm90ZXMJAAEsAAAAAgUAAAAFdm90ZTEFAAAAB25ld1ZvdGUEAAAADW5ld0RhdGFTdHJpbmcJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAPbmV3Vm90ZXNDb3VudGVyAgAAAAEvBQAAAAluZXdWb3RlcnMCAAAAAS8FAAAACG5ld1ZvdGVzBQAAAA1uZXdEYXRhU3RyaW5nAwkAAAAAAAACBQAAAAx2b3Rlc0NvdW50ZXICAAAAATIEAAAACnZvdGVyc0xpc3QJAAS1AAAAAgkAAZEAAAACBQAAAA9kaXNwdXRlRGF0YUxpc3QAAAAAAAAAAAECAAAAAV8EAAAACXZvdGVzTGlzdAkABLUAAAACCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAgIAAAABXwQAAAAMYWxyZWFkeVZvdGVkAwkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAAABgkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAABAwUAAAAMYWxyZWFkeVZvdGVkCQAAAgAAAAECAAAAEVlvdSBhbHJlYWR5IHZvdGVkBAAAAA9uZXdWb3Rlc0NvdW50ZXICAAAAATMEAAAACW5ld1ZvdGVycwkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAPZGlzcHV0ZURhdGFMaXN0AAAAAAAAAAABAgAAAAFfBQAAAAhuZXdWb3RlcgQAAAAIbmV3Vm90ZXMJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAgIAAAABXwUAAAAHbmV3Vm90ZQQAAAANbmV3RGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA9uZXdWb3Rlc0NvdW50ZXICAAAAAS8FAAAACW5ld1ZvdGVycwIAAAABLwUAAAAIbmV3Vm90ZXMFAAAADW5ld0RhdGFTdHJpbmcDCQAAAAAAAAIFAAAADHZvdGVzQ291bnRlcgIAAAABMwQAAAAKdm90ZXJzTGlzdAkABLUAAAACCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAQIAAAABXwQAAAAJdm90ZXNMaXN0CQAEtQAAAAIJAAGRAAAAAgUAAAAPZGlzcHV0ZURhdGFMaXN0AAAAAAAAAAACAgAAAAFfBAAAAAxhbHJlYWR5Vm90ZWQDAwkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAAABgkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAABBgkAAAAAAAACBQAAAAhuZXdWb3RlcgkAAZEAAAACBQAAAAp2b3RlcnNMaXN0AAAAAAAAAAACAwUAAAAMYWxyZWFkeVZvdGVkCQAAAgAAAAECAAAAEVlvdSBhbHJlYWR5IHZvdGVkBAAAAA9uZXdWb3Rlc0NvdW50ZXICAAAAATQEAAAACW5ld1ZvdGVycwkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAPZGlzcHV0ZURhdGFMaXN0AAAAAAAAAAABAgAAAAFfBQAAAAhuZXdWb3RlcgQAAAAIbmV3Vm90ZXMJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAAD2Rpc3B1dGVEYXRhTGlzdAAAAAAAAAAAAgIAAAABXwUAAAAHbmV3Vm90ZQQAAAANbmV3RGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAA9uZXdWb3Rlc0NvdW50ZXICAAAAAS8FAAAACW5ld1ZvdGVycwIAAAABLwUAAAAIbmV3Vm90ZXMFAAAADW5ld0RhdGFTdHJpbmcJAAACAAAAAQIAAAAhRGlzcHV0ZSBoYXMgYmVlbiBhbHJlYWR5IHJlc29sdmVkCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAFfBQAAAAxzdGF0ZURpc3B1dGUFAAAAFG5ld0Rpc3B1dGVEYXRhU3RyaW5nBQAAAANuaWwAAAABaQEAAAAKd29ya0lzRG9uZQAAAAEAAAAJYXVjdGlvbklkBAAAAA9hdWN0aW9uRGF0YUxpc3QJAQAAAAtnZXREYXRhTGlzdAAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXRlCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAAQAAAAMYXVjdGlvblN0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAACBAAAABRhdWN0aW9uRXhlY3V0aW9uVGltZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAwQAAAALY3VycmVudFRpbWUFAAAABmhlaWdodAQAAAASZnJlZWxhbmNlclB1YkNoZWNrBAAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAABFhdWN0aW9uRnJlZWxhbmNlcgkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAYDCQAAAAAAAAIFAAAABmNhbGxlcgUAAAARYXVjdGlvbkZyZWVsYW5jZXIFAAAABmNhbGxlcgkAAAIAAAABAgAAADRPbmx5IGEgZnJlZWxhbmNlciBjYW4gaW5kaWNhdGUgdGhhdCB0aGUgd29yayBpcyBkb25lBAAAAAp0aW1lSXNPdmVyCQAAZgAAAAIJAABlAAAAAgUAAAALY3VycmVudFRpbWUFAAAADGF1Y3Rpb25TdGFydAUAAAAUYXVjdGlvbkV4ZWN1dGlvblRpbWUDCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzAwUAAAAKdGltZUlzT3ZlcgQAAAANbmV3RGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAQIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAICAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAADAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABAIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAUCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAGCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAlhdWN0aW9uSWQJAAEsAAAAAgUAAAAMc3RhdGVEaXNwdXRlBQAAAA1uZXdEYXRhU3RyaW5nBQAAAANuaWwEAAAADW5ld0RhdGFTdHJpbmcJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAECAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAACAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAwIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAQCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAFAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAJYXVjdGlvbklkCQABLAAAAAIFAAAAEXN0YXRlV2FpdDRDb25maXJtBQAAAA1uZXdEYXRhU3RyaW5nBQAAAANuaWwJAAACAAAAAQIAAAAaQXVjdGlvbiBzdGF0ZSBpcyBpbmNvcnJlY3QAAAABaQEAAAAQYWNjZXB0QnlDdXN0b21lcgAAAAEAAAAJYXVjdGlvbklkBAAAAA9hdWN0aW9uRGF0YUxpc3QJAQAAAAtnZXREYXRhTGlzdAAAAAEFAAAACWF1Y3Rpb25JZAQAAAAMYXVjdGlvblN0YXRlCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAAQAAAAPYXVjdGlvbkN1c3RvbWVyCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAQQAAAAQYXVjdGlvbkFzc2V0TmFtZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAQEAAAADGF1Y3Rpb25QcmljZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABQQAAAARYXVjdGlvbkZyZWVsYW5jZXIJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAGBAAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAA5kQXBwQ29tbWlzc2lvbgkAAGkAAAACCQAAaAAAAAIFAAAADGF1Y3Rpb25QcmljZQAAAAAAAAAAAwAAAAAAAAAAZAQAAAARYW1vdW50V2l0aG91dENvbW0JAABlAAAAAgUAAAAMYXVjdGlvblByaWNlBQAAAA5kQXBwQ29tbWlzc2lvbgQAAAAQYXVjdGlvbkFzc2V0SWQ1OAkBAAAAEUFzc2V0TmFtZVRvQmFzZTU4AAAAAQUAAAAQYXVjdGlvbkFzc2V0TmFtZQQAAAAJbmV3UmF0aW5nBAAAAAt2YWx1ZVJhdGluZwkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAAEWF1Y3Rpb25GcmVlbGFuY2VyAgAAAAdfUmF0aW5nBAAAAA1jdXJyZW50UmF0aW5nBAAAAAckbWF0Y2gwBQAAAAt2YWx1ZVJhdGluZwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAACQAAZAAAAAIFAAAADWN1cnJlbnRSYXRpbmcAAAAAAAAAAAEDCQAAAAAAAAIFAAAABmNhbGxlcgUAAAAPYXVjdGlvbkN1c3RvbWVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAAEXN0YXRlV2FpdDRDb25maXJtBAAAAA1uZXdEYXRhU3RyaW5nCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAABAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAgIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAMCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAEAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABQIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAYJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAlhdWN0aW9uSWQJAAEsAAAAAgUAAAANc3RhdGVDb21wbGV0ZQUAAAANbmV3RGF0YVN0cmluZwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkAASwAAAACBQAAABFhdWN0aW9uRnJlZWxhbmNlcgIAAAAHX1JhdGluZwUAAAAJbmV3UmF0aW5nBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAABFhdWN0aW9uRnJlZWxhbmNlcgUAAAARYW1vdW50V2l0aG91dENvbW0FAAAAEGF1Y3Rpb25Bc3NldElkNTgFAAAAA25pbAkAAAIAAAABCQABLAAAAAICAAAAGkluY29ycmVjdCBzdGF0ZS4gTXVzdCBiZTogBQAAABFzdGF0ZVdhaXQ0Q29uZmlybQkAAAIAAAABAgAAACtPbmx5IGF1Y3Rpb24gY3VzdG9tZXIgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5BAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAADdHR4BQAAAAckbWF0Y2gwBgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAAAAA3N0eAUAAAAHJG1hdGNoMAYHB+SLHjU=", "chainId": 84, "height": 663058, "spentComplexity": 0 } View: original | compacted Prev: 3VKqRx4Uzk77ktaLWwwxj5dDeVSpm8e1Vk2PCADF1MGV Next: EntXs9xrRnEXHcdroPfb913ypGj4173xsXC5oHw6VoRc Full:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 3 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let wBTC = base58'1' | |
4 | + | let auctionTime = 4320 | |
5 | + | ||
6 | + | let day = 1440 | |
7 | + | ||
8 | + | let comission = 3 | |
9 | + | ||
10 | + | let WAVES = unit | |
11 | + | ||
12 | + | let wBTC = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' | |
13 | + | ||
14 | + | let wEUR = base58'Gtb1WRznfchDnTh37ezoDTJ4wcoKaRsKqKjJjy7nm2zU' | |
15 | + | ||
16 | + | let wUSD = base58'Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck' | |
17 | + | ||
18 | + | let stateOpen = "Opened" | |
19 | + | ||
20 | + | let stateSuggested = "Suggested" | |
21 | + | ||
22 | + | let stateCancel = "Canceled" | |
23 | + | ||
24 | + | let stateInProgress = "InProgress" | |
25 | + | ||
26 | + | let stateWait4Confirm = "WaitForConfirmation" | |
27 | + | ||
28 | + | let stateComplete = "Completed" | |
29 | + | ||
30 | + | let stateDispute = "Dispute" | |
31 | + | ||
32 | + | let stateDisputeResolved = "DisputeResolved" | |
33 | + | ||
34 | + | let customer = "CMR" | |
35 | + | ||
36 | + | let freelancer = "FL" | |
37 | + | ||
38 | + | let ambassador1 = base58'1' | |
39 | + | ||
40 | + | let ambassador2 = base58'1' | |
41 | + | ||
42 | + | let ambassador3 = base58'1' | |
43 | + | ||
44 | + | let ambassador4 = base58'1' | |
45 | + | ||
46 | + | let ambassador5 = base58'1' | |
47 | + | ||
48 | + | func getDataList (auctionId) = { | |
49 | + | let getDataString = getString(this, auctionId) | |
50 | + | let a = match getDataString { | |
51 | + | case a: String => | |
52 | + | a | |
53 | + | case _ => | |
54 | + | throw("AuctionId was not found") | |
55 | + | } | |
56 | + | split(a, "_") | |
57 | + | } | |
58 | + | ||
59 | + | ||
60 | + | func getDisputeDataList (auctionId) = { | |
61 | + | let keyDisputeData = ((auctionId + "_") + stateDispute) | |
62 | + | let getDisputeDataString = getString(this, keyDisputeData) | |
63 | + | let a = match getDisputeDataString { | |
64 | + | case a: String => | |
65 | + | a | |
66 | + | case _ => | |
67 | + | throw("Dispute data was not found") | |
68 | + | } | |
69 | + | split(a, "/") | |
70 | + | } | |
71 | + | ||
72 | + | ||
73 | + | func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES")) | |
74 | + | then WAVES | |
75 | + | else if ((auctionAssetName == "BTC")) | |
76 | + | then wBTC | |
77 | + | else if ((auctionAssetName == "EUR")) | |
78 | + | then wEUR | |
79 | + | else if ((auctionAssetName == "USD")) | |
80 | + | then wUSD | |
81 | + | else throw("Incorrect Asset Id") | |
82 | + | ||
83 | + | ||
84 | + | func betPriceCheck (betPrice,auctionPrice) = if ((auctionPrice > betPrice)) | |
85 | + | then betPrice | |
86 | + | else throw(("Bet price must be lower than actual price. Actual price: " + toString(auctionPrice))) | |
87 | + | ||
88 | + | ||
89 | + | func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime) | |
90 | + | ||
91 | + | ||
92 | + | func freezeFunds (pmtAssetName,auctionPrice,dAppCommission) = { | |
93 | + | let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed")) | |
94 | + | let currentFreezedBalance = match keyFreezedFunds { | |
95 | + | case a: Int => | |
96 | + | a | |
97 | + | case _ => | |
98 | + | 0 | |
99 | + | } | |
100 | + | ((currentFreezedBalance + auctionPrice) - dAppCommission) | |
101 | + | } | |
102 | + | ||
103 | + | ||
104 | + | func freelancerIsRegistered (caller) = { | |
105 | + | let freelancerIsRegistered = getString(this, (caller + "_Status")) | |
106 | + | match freelancerIsRegistered { | |
107 | + | case a: String => | |
108 | + | a | |
109 | + | case _ => | |
110 | + | throw("Only registered users can make bets") | |
111 | + | } | |
112 | + | } | |
113 | + | ||
5 | 114 | ||
6 | 115 | @Callable(i) | |
7 | - | func function (auctionAssetName) = { | |
8 | - | let pmt = extract(i.payment) | |
9 | - | let assetId = pmt.assetId | |
10 | - | let AssetIdCheck = if ((auctionAssetName == "WAVES")) | |
11 | - | then unit | |
12 | - | else if ((auctionAssetName == "BTC")) | |
13 | - | then wBTC | |
14 | - | else throw("Incorrect Asset Id") | |
15 | - | ScriptResult(WriteSet([DataEntry("asset", auctionAssetName)]), TransferSet([ScriptTransfer(i.caller, 1, AssetIdCheck)])) | |
116 | + | func signUp (info) = { | |
117 | + | let userPublicKey = toBase58String(i.callerPublicKey) | |
118 | + | let alreadyRegistered = getString(this, (userPublicKey + "_Registered")) | |
119 | + | if (isDefined(alreadyRegistered)) | |
120 | + | then throw("User already registered") | |
121 | + | else WriteSet([DataEntry((userPublicKey + "_Registered"), info)]) | |
16 | 122 | } | |
17 | 123 | ||
124 | + | ||
125 | + | ||
126 | + | @Callable(i) | |
127 | + | func createAuction (executionDays) = { | |
128 | + | let auctionId = toBase58String(i.transactionId) | |
129 | + | let auctionCustomer = toBase58String(i.callerPublicKey) | |
130 | + | let pmt = extract(i.payment) | |
131 | + | let auctionPrice = if ((pmt.amount > 0)) | |
132 | + | then pmt.amount | |
133 | + | else throw("Amount must be higher then 0") | |
134 | + | let auctionStart = height | |
135 | + | let blocksForExecution = (executionDays * day) | |
136 | + | let dAppCommission = ((auctionPrice * 3) / 100) | |
137 | + | let pmtAssetName = if (!(isDefined(pmt.assetId))) | |
138 | + | then "WAVES" | |
139 | + | else if ((pmt.assetId == wBTC)) | |
140 | + | then "BTC" | |
141 | + | else if ((pmt.assetId == wEUR)) | |
142 | + | then "EUR" | |
143 | + | else if ((pmt.assetId == wUSD)) | |
144 | + | then "USD" | |
145 | + | else throw("AssetId is incorrect") | |
146 | + | let newFreezedBalance = freezeFunds(pmtAssetName, auctionPrice, dAppCommission) | |
147 | + | WriteSet([DataEntry(auctionId, ((((((((((stateOpen + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(blocksForExecution)) + "_") + pmtAssetName) + "_") + toString(auctionPrice))), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)]) | |
148 | + | } | |
149 | + | ||
150 | + | ||
151 | + | ||
152 | + | @Callable(i) | |
153 | + | func makeBet (auctionId,betPrice) = { | |
154 | + | let pmt = extract(i.payment) | |
155 | + | let pmtAssetId = pmt.assetId | |
156 | + | let caller = toBase58String(i.callerPublicKey) | |
157 | + | let betTime = height | |
158 | + | let auctionDataList = getDataList(auctionId) | |
159 | + | let auctionState = auctionDataList[0] | |
160 | + | let auctionCustomer = fromBase58String(auctionDataList[1]) | |
161 | + | let auctionStart = parseIntValue(auctionDataList[2]) | |
162 | + | let auctionAssetName = auctionDataList[4] | |
163 | + | let auctionPrice = parseIntValue(auctionDataList[5]) | |
164 | + | let auctionAssetId58 = AssetNameToBase58(auctionAssetName) | |
165 | + | let newBet = betPriceCheck(betPrice, auctionPrice) | |
166 | + | let newFreelancer = freelancerIsRegistered(caller) | |
167 | + | let pmtAssetName = if ((pmtAssetId == WAVES)) | |
168 | + | then "WAVES" | |
169 | + | else if ((pmtAssetId == wBTC)) | |
170 | + | then "BTC" | |
171 | + | else if ((pmtAssetId == wEUR)) | |
172 | + | then "EUR" | |
173 | + | else if ((pmtAssetId == wUSD)) | |
174 | + | then "USD" | |
175 | + | else throw("AssetId is incorrect") | |
176 | + | let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionTime) | |
177 | + | if ((pmtAssetId == auctionAssetId58)) | |
178 | + | then if (auctionTimeisOver) | |
179 | + | then if ((auctionState == stateOpen)) | |
180 | + | then { | |
181 | + | let dataString = ((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) | |
182 | + | let amountWithoutComm = (auctionPrice - ((auctionPrice * 3) / 100)) | |
183 | + | ScriptResult(WriteSet([DataEntry(auctionId, ((stateCancel + "_") + dataString))]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionCustomer), amountWithoutComm, auctionAssetId58)])) | |
184 | + | } | |
185 | + | else if ((auctionState == stateSuggested)) | |
186 | + | then { | |
187 | + | let dataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6]) | |
188 | + | WriteSet([DataEntry(auctionId, ((stateInProgress + "_") + dataString))]) | |
189 | + | } | |
190 | + | else throw(((((("Incorrect auctionId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested)) | |
191 | + | else if (if ((auctionState == stateOpen)) | |
192 | + | then true | |
193 | + | else (auctionState == stateSuggested)) | |
194 | + | then { | |
195 | + | let dataString = ((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) | |
196 | + | WriteSet([DataEntry(auctionId, ((((((stateSuggested + "_") + dataString) + "_") + toString(newBet)) + "_") + newFreelancer))]) | |
197 | + | } | |
198 | + | else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested)) | |
199 | + | else throw(("Payment must be in " + auctionAssetName)) | |
200 | + | } | |
201 | + | ||
202 | + | ||
203 | + | ||
204 | + | @Callable(i) | |
205 | + | func increaseExecutionTime (auctionId,executionDays) = { | |
206 | + | let caller = toBase58String(i.callerPublicKey) | |
207 | + | let auctionDataList = getDataList(auctionId) | |
208 | + | let auctionState = auctionDataList[0] | |
209 | + | let auctionCustomer = auctionDataList[1] | |
210 | + | let auctionExecutionTime = parseIntValue(auctionDataList[3]) | |
211 | + | let newAuctionExecutionTime = { | |
212 | + | let newExecutionTime = (executionDays * day) | |
213 | + | if ((newExecutionTime > auctionExecutionTime)) | |
214 | + | then newExecutionTime | |
215 | + | else throw("New execution time must more than current execution time") | |
216 | + | } | |
217 | + | if ((caller == auctionCustomer)) | |
218 | + | then if (if (if ((auctionState == stateOpen)) | |
219 | + | then true | |
220 | + | else (auctionState == stateSuggested)) | |
221 | + | then true | |
222 | + | else (auctionState == stateInProgress)) | |
223 | + | then { | |
224 | + | let newDataString = ((((((((((((auctionState + "_") + auctionCustomer) + "_") + auctionDataList[2]) + "_") + toString(newAuctionExecutionTime)) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6]) | |
225 | + | WriteSet([DataEntry(auctionId, newDataString)]) | |
226 | + | } | |
227 | + | else throw("Incorrect state") | |
228 | + | else throw("Only customer can increase execution time") | |
229 | + | } | |
230 | + | ||
231 | + | ||
232 | + | ||
233 | + | @Callable(i) | |
234 | + | func cancelAuction (auctionId) = { | |
235 | + | let auctionDataList = getDataList(auctionId) | |
236 | + | let auctionState = auctionDataList[0] | |
237 | + | let auctionCustomer = fromBase58String(auctionDataList[1]) | |
238 | + | let auctionIdOwnerCheck = if ((i.callerPublicKey == auctionCustomer)) | |
239 | + | then true | |
240 | + | else throw("Auction can be canceled only by owner.") | |
241 | + | if ((auctionState == stateOpen)) | |
242 | + | then { | |
243 | + | let dataString = ((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) | |
244 | + | WriteSet([DataEntry(auctionId, ((stateCancel + "_") + dataString))]) | |
245 | + | } | |
246 | + | else throw("Incorrect auction state.") | |
247 | + | } | |
248 | + | ||
249 | + | ||
250 | + | ||
251 | + | @Callable(i) | |
252 | + | func openDispute (auctionId) = { | |
253 | + | let caller = toBase58String(i.callerPublicKey) | |
254 | + | let auctionDataList = getDataList(auctionId) | |
255 | + | let auctionState = auctionDataList[0] | |
256 | + | let auctionCustomer = auctionDataList[1] | |
257 | + | let auctionFreelancer = auctionDataList[6] | |
258 | + | if (if ((caller == auctionCustomer)) | |
259 | + | then true | |
260 | + | else (caller == auctionFreelancer)) | |
261 | + | then { | |
262 | + | let dataString = "1" | |
263 | + | WriteSet([DataEntry(auctionId, (stateDispute + dataString)), DataEntry((auctionId + "_Dispute"), "0")]) | |
264 | + | } | |
265 | + | else throw("Only customer and freelancer can open dispute") | |
266 | + | } | |
267 | + | ||
268 | + | ||
269 | + | ||
270 | + | @Callable(i) | |
271 | + | func voteDispute (auctionId,vote) = { | |
272 | + | let auctionDataList = getDataList(auctionId) | |
273 | + | let auctionStateCheck = { | |
274 | + | let auctionState = auctionDataList[0] | |
275 | + | if ((auctionState == stateDispute)) | |
276 | + | then true | |
277 | + | else throw(("Incorrect state. Must be: " + stateDispute)) | |
278 | + | } | |
279 | + | let auctionAssetId = auctionDataList[4] | |
280 | + | let auctionPrice = parseIntValue(auctionDataList[5]) | |
281 | + | let newVote = if (if ((vote == customer)) | |
282 | + | then true | |
283 | + | else (vote == freelancer)) | |
284 | + | then vote | |
285 | + | else throw(((("Vote is incorrect. Must be: " + customer) + " or ") + freelancer)) | |
286 | + | let newVoter = if (if (if (if (if ((i.callerPublicKey == ambassador1)) | |
287 | + | then true | |
288 | + | else (i.callerPublicKey == ambassador2)) | |
289 | + | then true | |
290 | + | else (i.callerPublicKey == ambassador3)) | |
291 | + | then true | |
292 | + | else (i.callerPublicKey == ambassador4)) | |
293 | + | then true | |
294 | + | else (i.callerPublicKey == ambassador5)) | |
295 | + | then toBase58String(i.callerPublicKey) | |
296 | + | else throw("You have no rights for disputes resolving") | |
297 | + | let disputeData = { | |
298 | + | let keyDispute = ((auctionId + "_") + stateDispute) | |
299 | + | let valueDispute = getString(this, keyDispute) | |
300 | + | match valueDispute { | |
301 | + | case a: String => | |
302 | + | a | |
303 | + | case _ => | |
304 | + | throw("Cannot find data of dispute in storage") | |
305 | + | } | |
306 | + | } | |
307 | + | let disputeDataList = split(disputeData, "/") | |
308 | + | let votesCounter = disputeDataList[0] | |
309 | + | if ((votesCounter == "4")) | |
310 | + | then { | |
311 | + | let votersList = split(disputeDataList[1], "_") | |
312 | + | let votesList = split(disputeDataList[2], "_") | |
313 | + | let alreadyVoted = if ((newVoter == votersList[0])) | |
314 | + | then true | |
315 | + | else (newVoter == votersList[1]) | |
316 | + | if (alreadyVoted) | |
317 | + | then throw("You already voted") | |
318 | + | else { | |
319 | + | let newVotesCounter = "5" | |
320 | + | let newVoters = ((disputeDataList[1] + "_") + newVoter) | |
321 | + | let newVotes = ((disputeDataList[2] + "_") + newVote) | |
322 | + | let newDisputeDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes) | |
323 | + | let disputeWinner = { | |
324 | + | let vote1 = if ((votesList[0] == customer)) | |
325 | + | then 1 | |
326 | + | else 0 | |
327 | + | let vote2 = if ((votesList[1] == customer)) | |
328 | + | then 1 | |
329 | + | else 0 | |
330 | + | let vote3 = if ((votesList[2] == customer)) | |
331 | + | then 1 | |
332 | + | else 0 | |
333 | + | let vote4 = if ((votesList[3] == customer)) | |
334 | + | then 1 | |
335 | + | else 0 | |
336 | + | let vote5 = if ((newVote == customer)) | |
337 | + | then 1 | |
338 | + | else 0 | |
339 | + | let customerVotes = ((((vote1 + vote2) + vote3) + vote4) + vote5) | |
340 | + | if ((customerVotes > 2)) | |
341 | + | then customer | |
342 | + | else freelancer | |
343 | + | } | |
344 | + | let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6]) | |
345 | + | let DisputeWinnerAddress = if ((disputeWinner == customer)) | |
346 | + | then auctionDataList[1] | |
347 | + | else auctionDataList[6] | |
348 | + | let amountWithoutComm = (auctionPrice - ((auctionPrice * 3) / 100)) | |
349 | + | ScriptResult(WriteSet([DataEntry(auctionId, (stateDisputeResolved + newDataString)), DataEntry(((auctionId + "_") + stateDispute), newDisputeDataString)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(DisputeWinnerAddress)), amountWithoutComm, fromBase58String(auctionAssetId))])) | |
350 | + | } | |
351 | + | } | |
352 | + | else { | |
353 | + | let newDisputeDataString = if ((votesCounter == "0")) | |
354 | + | then { | |
355 | + | let newVotesCounter = "1" | |
356 | + | let newVoters = newVoter | |
357 | + | let newVotes = newVote | |
358 | + | let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes) | |
359 | + | newDataString | |
360 | + | } | |
361 | + | else if ((votesCounter == "1")) | |
362 | + | then { | |
363 | + | let voter1 = disputeDataList[1] | |
364 | + | let vote1 = disputeDataList[2] | |
365 | + | let alreadyVoted = (newVoter == voter1) | |
366 | + | if (alreadyVoted) | |
367 | + | then throw("You already voted") | |
368 | + | else { | |
369 | + | let newVotesCounter = "1" | |
370 | + | let newVoters = (voter1 + newVoter) | |
371 | + | let newVotes = (vote1 + newVote) | |
372 | + | let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes) | |
373 | + | newDataString | |
374 | + | } | |
375 | + | } | |
376 | + | else if ((votesCounter == "2")) | |
377 | + | then { | |
378 | + | let votersList = split(disputeDataList[1], "_") | |
379 | + | let votesList = split(disputeDataList[2], "_") | |
380 | + | let alreadyVoted = if ((newVoter == votersList[0])) | |
381 | + | then true | |
382 | + | else (newVoter == votersList[1]) | |
383 | + | if (alreadyVoted) | |
384 | + | then throw("You already voted") | |
385 | + | else { | |
386 | + | let newVotesCounter = "3" | |
387 | + | let newVoters = ((disputeDataList[1] + "_") + newVoter) | |
388 | + | let newVotes = ((disputeDataList[2] + "_") + newVote) | |
389 | + | let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes) | |
390 | + | newDataString | |
391 | + | } | |
392 | + | } | |
393 | + | else if ((votesCounter == "3")) | |
394 | + | then { | |
395 | + | let votersList = split(disputeDataList[1], "_") | |
396 | + | let votesList = split(disputeDataList[2], "_") | |
397 | + | let alreadyVoted = if (if ((newVoter == votersList[0])) | |
398 | + | then true | |
399 | + | else (newVoter == votersList[1])) | |
400 | + | then true | |
401 | + | else (newVoter == votersList[2]) | |
402 | + | if (alreadyVoted) | |
403 | + | then throw("You already voted") | |
404 | + | else { | |
405 | + | let newVotesCounter = "4" | |
406 | + | let newVoters = ((disputeDataList[1] + "_") + newVoter) | |
407 | + | let newVotes = ((disputeDataList[2] + "_") + newVote) | |
408 | + | let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes) | |
409 | + | newDataString | |
410 | + | } | |
411 | + | } | |
412 | + | else throw("Dispute has been already resolved") | |
413 | + | WriteSet([DataEntry(((auctionId + "_") + stateDispute), newDisputeDataString)]) | |
414 | + | } | |
415 | + | } | |
416 | + | ||
417 | + | ||
418 | + | ||
419 | + | @Callable(i) | |
420 | + | func workIsDone (auctionId) = { | |
421 | + | let auctionDataList = getDataList(auctionId) | |
422 | + | let auctionState = auctionDataList[0] | |
423 | + | let auctionStart = parseIntValue(auctionDataList[2]) | |
424 | + | let auctionExecutionTime = parseIntValue(auctionDataList[3]) | |
425 | + | let currentTime = height | |
426 | + | let freelancerPubCheck = { | |
427 | + | let caller = toBase58String(i.callerPublicKey) | |
428 | + | let auctionFreelancer = auctionDataList[6] | |
429 | + | if ((caller == auctionFreelancer)) | |
430 | + | then caller | |
431 | + | else throw("Only a freelancer can indicate that the work is done") | |
432 | + | } | |
433 | + | let timeIsOver = ((currentTime - auctionStart) > auctionExecutionTime) | |
434 | + | if ((auctionState == stateInProgress)) | |
435 | + | then if (timeIsOver) | |
436 | + | then { | |
437 | + | let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6]) | |
438 | + | WriteSet([DataEntry(auctionId, (stateDispute + newDataString))]) | |
439 | + | } | |
440 | + | else { | |
441 | + | let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6]) | |
442 | + | WriteSet([DataEntry(auctionId, (stateWait4Confirm + newDataString))]) | |
443 | + | } | |
444 | + | else throw("Auction state is incorrect") | |
445 | + | } | |
446 | + | ||
447 | + | ||
448 | + | ||
449 | + | @Callable(i) | |
450 | + | func acceptByCustomer (auctionId) = { | |
451 | + | let auctionDataList = getDataList(auctionId) | |
452 | + | let auctionState = auctionDataList[0] | |
453 | + | let auctionCustomer = auctionDataList[1] | |
454 | + | let auctionAssetName = auctionDataList[4] | |
455 | + | let auctionPrice = parseIntValue(auctionDataList[5]) | |
456 | + | let auctionFreelancer = auctionDataList[6] | |
457 | + | let caller = toBase58String(i.callerPublicKey) | |
458 | + | let dAppCommission = ((auctionPrice * 3) / 100) | |
459 | + | let amountWithoutComm = (auctionPrice - dAppCommission) | |
460 | + | let auctionAssetId58 = AssetNameToBase58(auctionAssetName) | |
461 | + | let newRating = { | |
462 | + | let valueRating = getInteger(this, (auctionFreelancer + "_Rating")) | |
463 | + | let currentRating = match valueRating { | |
464 | + | case a: Int => | |
465 | + | a | |
466 | + | case _ => | |
467 | + | 0 | |
468 | + | } | |
469 | + | (currentRating + 1) | |
470 | + | } | |
471 | + | if ((caller == auctionCustomer)) | |
472 | + | then if ((auctionState == stateWait4Confirm)) | |
473 | + | then { | |
474 | + | let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6]) | |
475 | + | ScriptResult(WriteSet([DataEntry(auctionId, (stateComplete + newDataString)), DataEntry((auctionFreelancer + "_Rating"), newRating)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionFreelancer)), amountWithoutComm, auctionAssetId58)])) | |
476 | + | } | |
477 | + | else throw(("Incorrect state. Must be: " + stateWait4Confirm)) | |
478 | + | else throw("Only auction customer can use this function") | |
479 | + | } | |
480 | + | ||
481 | + | ||
482 | + | @Verifier(tx) | |
483 | + | func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)) | |
484 | + | then match tx { | |
485 | + | case ttx: TransferTransaction => | |
486 | + | true | |
487 | + | case stx: SetScriptTransaction => | |
488 | + | true | |
489 | + | case _ => | |
490 | + | false | |
491 | + | } | |
492 | + | else false | |
18 | 493 |
github/deemru/w8io/169f3d6 43.36 ms ◑![]()