tx · EntXs9xrRnEXHcdroPfb913ypGj4173xsXC5oHw6VoRc

3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2:  -0.01500000 Waves

2019.09.19 16:48 [683249] smart account 3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2 > SELF 0.00000000 Waves

{ "type": 13, "id": "EntXs9xrRnEXHcdroPfb913ypGj4173xsXC5oHw6VoRc", "fee": 1500000, "feeAssetId": null, "timestamp": 1568900946377, "version": 1, "sender": "3N2EM5HFgf6UMBnvcJX3Cegmozwdv1iDeq2", "senderPublicKey": "8y2Uc9uYf5gRD6Dzm1aC73zYe3LZvtVDUVAnAhNdN2mg", "proofs": [ "4C1bivYZfviNU8iThmeFMc8UAfpvnASKFQafbqHB4GbXrw5JHgvS8PX8Zb3jKKz6XK9RL84AK5N946VTgzr9EghM" ], "script": "base64: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cmljZQEAAAAJdGltZUNoZWNrAAAAAwAAAAtjdXJyZW50VGltZQAAAAlzdGFydFRpbWUAAAAOZXhwaXJhdGlvblRpbWUJAABmAAAAAgkAAGUAAAACBQAAAAtjdXJyZW50VGltZQUAAAAJc3RhcnRUaW1lBQAAAA5leHBpcmF0aW9uVGltZQEAAAAWaW5jcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIAAAAMcG10QXNzZXROYW1lAAAADGF1Y3Rpb25QcmljZQQAAAAPa2V5RnJlZXplZEZ1bmRzCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAMcG10QXNzZXROYW1lAgAAAAhfRnJlZXplZAQAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBAAAAAckbWF0Y2gwBQAAAA9rZXlGcmVlemVkRnVuZHMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAkAAGQAAAACBQAAABVjdXJyZW50RnJlZXplZEJhbGFuY2UFAAAADGF1Y3Rpb25QcmljZQEAAAAWZGVjcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIAAAAMcG10QXNzZXROYW1lAAAADGF1Y3Rpb25QcmljZQQAAAAPa2V5RnJlZXplZEZ1bmRzCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAMcG10QXNzZXROYW1lAgAAAAhfRnJlZXplZAQAAAAVY3VycmVudEZyZWV6ZWRCYWxhbmNlBAAAAAckbWF0Y2gwBQAAAA9rZXlGcmVlemVkRnVuZHMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAQAAAABYQkAAGUAAAACBQAAABVjdXJyZW50RnJlZXplZEJhbGFuY2UFAAAADGF1Y3Rpb25QcmljZQMJAABmAAAAAgUAAAABYQAAAAAAAAAAAAUAAAABYQkAAAIAAAABAgAAACZGcmVlemVkIGFtb3VudCBjb3VsZG4ndCBiZSBsZXNzIHRoYW4gMAEAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAAAAAEAAAAGY2FsbGVyBAAAABZmcmVlbGFuY2VySXNSZWdpc3RlcmVkCQAEHQAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAGY2FsbGVyAgAAAAdfU3RhdHVzBAAAAAckbWF0Y2gwBQAAABZmcmVlbGFuY2VySXNSZWdpc3RlcmVkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEJAAACAAAAAQIAAAAjT25seSByZWdpc3RlcmVkIHVzZXJzIGNhbiBtYWtlIGJldHMAAAALAAAAAWkBAAAAEGZyZWVsYW5jZXJTaWduVXAAAAABAAAABGluZm8EAAAADXVzZXJQdWJsaWNLZXkJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAABFhbHJlYWR5UmVnaXN0ZXJlZAkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAAC19GcmVlbGFuY2VyAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAAAgAAAAECAAAAF1VzZXIgYWxyZWFkeSByZWdpc3RlcmVkCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAAC19SZWdpc3RlcmVkBQAAAARpbmZvBQAAAANuaWwAAAABaQEAAAAMY2xpZW50U2lnblVwAAAAAQAAAARpbmZvBAAAAA11c2VyUHVibGljS2V5CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAARYWxyZWFkeVJlZ2lzdGVyZWQJAAQdAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAA11c2VyUHVibGljS2V5AgAAAAdfQ2xpZW50AwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAEWFscmVhZHlSZWdpc3RlcmVkCQAAAgAAAAECAAAAF1VzZXIgYWxyZWFkeSByZWdpc3RlcmVkCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADXVzZXJQdWJsaWNLZXkCAAAAB19DbGllbnQFAAAABGluZm8FAAAAA25pbAAAAAFp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YUxpc3QAAAAAAAAAAAMEAAAAGWF1Y3Rpb25CbG9ja3NGb3JFeGVjdXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAQEAAAAEGF1Y3Rpb25Bc3NldE5hbWUJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAFBAAAAAxhdWN0aW9uUHJpY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAYEAAAAEGF1Y3Rpb25Bc3NldElkNTgJAQAAABFBc3NldE5hbWVUb0Jhc2U1OAAAAAEFAAAAEGF1Y3Rpb25Bc3NldE5hbWUEAAAABm5ld0JpZAkBAAAADWJldFByaWNlQ2hlY2sAAAACBQAAAAhiZXRQcmljZQUAAAAMYXVjdGlvblByaWNlBAAAAA1uZXdGcmVlbGFuY2VyCQEAAAAWZnJlZWxhbmNlcklzUmVnaXN0ZXJlZAAAAAEFAAAACWNhbGxlclB1YgQAAAAOZEFwcENvbW1pc3Npb24JAABpAAAAAgkAAGgAAAACBQAAAAxhdWN0aW9uUHJpY2UAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEW5ld0ZyZWV6ZWRCYWxhbmNlCQEAAAAWZGVjcmVhc2VGcmVlemVkQmFsYW5jZQAAAAIFAAAAEGF1Y3Rpb25Bc3NldE5hbWUFAAAADGF1Y3Rpb25QcmljZQQAAAARYXVjdGlvblRpbWVpc092ZXIJAQAAAAl0aW1lQ2hlY2sAAAADBQAAAAdiZXRUaW1lBQAAAAxhdWN0aW9uU3RhcnQFAAAAD2F1Y3Rpb25EdXJhdGlvbgMFAAAAEWF1Y3Rpb25UaW1laXNPdmVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADGF1Y3Rpb25JZEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJ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AAFfCQABpAAAAAEFAAAAD2F1Y3Rpb25EdXJhdGlvbgIAAAABXwkAAaQAAAABBQAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uAgAAAAFfBQAAABBhdWN0aW9uQXNzZXROYW1lAgAAAAFfCQABpAAAAAEFAAAADGF1Y3Rpb25QcmljZQIAAAABXwUAAAAWbmV3QXVjdGlvbkxvd2VzdEJpZGRlcgUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABxJbmNvcnJlY3Qgam9iSWQgc3RhdGUuIE5vdzogBQAAAAxhdWN0aW9uU3RhdGUCAAAACywgbXVzdCBiZTogBQAAAAlzdGF0ZU9wZW4CAAAABCBvciAFAAAADnN0YXRlU3VnZ2VzdGVkAAAAAWkBAAAAEGNob29zZUZyZWVsYW5jZXIAAAACAAAACWF1Y3Rpb25JZAAAAA1mcmVlbGFuY2VyUHViBAAAAAljYWxsZXJQdWIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAdiZXRUaW1lBQAAAAZoZWlnaHQEAAAADGF1Y3Rpb25JZEtleQkBAAAADEF1Y3Rpb25JZEtleQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkRhdGFMaXN0CQEAAAALZ2V0RGF0YUxpc3QAAAABBQAAAAxhdWN0aW9uSWRLZXkEAAAADGF1Y3Rpb25TdGF0ZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAAEAAAAD2F1Y3Rpb25DdXN0b21lcgkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAEEAAAADGF1Y3Rpb25TdGFydAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAgQAAAAPYXVjdGlvbkR1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAADBAAAABlhdWN0aW9uQmxvY2tzRm9yRXhlY3V0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAEBAAAABBhdWN0aW9uQXNzZXROYW1lCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABQQAAAAMYXVjdGlvblByaWNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAGBAAAABBhdWN0aW9uQXNzZXRJZDU4CQEAAAARQXNzZXROYW1lVG9CYXNlNTgAAAABBQAAABBhdWN0aW9uQXNzZXROYW1lBAAAABNGcmVlbGFuY2VyQmlkQW1vdW50BAAAABBrZXlGcmVlbGFuY2VyQmlkCQABLAAAAAIJAAEsAAAAAgUAAAAJYXVjdGlvbklkAgAAAAFfBQAAAA1mcmVlbGFuY2VyUHViBAAAABF2YWx1ZUZyZWVsYWNlckJpZAkABBoAAAACBQAAAAR0aGlzBQAAABBrZXlGcmVlbGFuY2VyQmlkBAAAAAckbWF0Y2gwBQAAABF2YWx1ZUZyZWVsYWNlckJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhCQAAAgAAAAECAAAAHkZyZWVsYW5jZXIncyBiZXQgd2FzIG5vdCBmb3VuZAQAAAAOZEFwcENvbW1pc3Npb24JAABpAAAAAgkAAGgAAAACBQAAAAxhdWN0aW9uUHJpY2UAAAAAAAAAAAMAAAAAAAAAAGQEAAAAEGFtb3VudERpZmZlcmVuY2UJAABlAAAAAgkAAGUAAAACBQAAAAxhdWN0aW9uUHJpY2UFAAAAE0ZyZWVsYW5jZXJCaWRBbW91bnQFAAAADmRBcHBDb21taXNzaW9uBAAAABFhdWN0aW9uVGltZWlzT3ZlcgkBAAAACXRpbWVDaGVjawAAAAMFAAAAB2JldFRpbWUFAAAADGF1Y3Rpb25TdGFydAUAAAAPYXVjdGlvbkR1cmF0aW9uAwkAAAAAAAACBQAAAAljYWxsZXJQdWIFAAAAD2F1Y3Rpb25DdXN0b21lcgMFAAAAEWF1Y3Rpb25UaW1laXNPdmVyAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgkBAAAADFNjcmlwdFJl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AAAACWF1Y3Rpb25JZAAAAA1leGVjdXRpb25EYXlzBAAAAAZjYWxsZXIJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAxhdWN0aW9uSWRLZXkJAQAAAAxBdWN0aW9uSWRLZXkAAAABBQAAAAlhdWN0aW9uSWQEAAAAD2F1Y3Rpb25EYXRhTGlzdAkBAAAAC2dldERhdGFMaXN0AAAAAQUAAAAMYXVjdGlvbklkS2V5BAAAAAxhdWN0aW9uU3RhdGUJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAABAAAAA9hdWN0aW9uQ3VzdG9tZXIJAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAABBAAAABRhdWN0aW9uRXhlY3V0aW9uVGltZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAwQAAAAXbmV3QXVjdGlvbkV4ZWN1dGlvblRpbWUEAAAAEG5ld0V4ZWN1dGlvblRpbWUJAABoAAAAAgUAAAANZXhlY3V0aW9uRGF5cwUAAAADZGF5AwkAAGYAAAACBQAAABBuZXdFeGVjdXRpb25UaW1lBQAAABRhdWN0aW9uRXhlY3V0aW9uVGltZQUAAAAQbmV3RXhlY3V0aW9uVGltZQkAAAIAAAABAgAAADhOZXcgZXhlY3V0aW9uIHRpbWUgbXVzdCBtb3JlIHRoYW4gY3VycmVudCBleGVjdXRpb24gdGltZQMJAAAAAAAAAgUAAAAGY2FsbGVyBQAAAA9hdWN0aW9uQ3VzdG9tZXIDAwMJAAAAAAAAAgUAAAAMYXVjdGlvblN0YXRlBQAAAAlzdGF0ZU9wZW4GCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAOc3RhdGVTdWdnZXN0ZWQGCQAAAAAAAAIFAAAADGF1Y3Rpb25TdGF0ZQUAAAAPc3RhdGVJblByb2dyZXNzBAAAAA1uZXdEYXRhU3RyaW5nCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAxhdWN0aW9uU3RhdGUCAAAAAV8FAAAAD2F1Y3Rpb25DdXN0b21lcgIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAICAAAAAV8JAAGkAAAAAQUAAAAXbmV3QXVjdGlvbkV4ZWN1dGlvblRpbWUCAAAAAV8JAAGRAAAAAgUAAAAPYXVjdGlvbkRhdGFMaXN0AAAAAAAAAAAEAgAAAAFfCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAABQIAAAABXwkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAYJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADGF1Y3Rpb25JZEtleQUAAAANbmV3RGF0YVN0cmluZwUAAAADbmlsCQAAAgAAAAECAAAAD0luY29ycmVjdCBzdGF0ZQkAAAIAAAABAgAAAClPbmx5IGN1c3RvbWVyIGNhbiBpbmNyZWFzZSBleGVjdXRpb24gdGltZQAAAAFpAQAAAA1jYW5jZWxBdWN0aW9uAAAAAQAAAAlhdWN0aW9uSWQEAAAADGF1Y3Rpb25JZEtleQkBAAAADEF1Y3Rpb25JZEtleQAAAAEFAAAACWF1Y3Rpb25JZAQAAAAPYXVjdGlvbkRhdGFMaXN0CQEAAAALZ2V0RGF0YUxpc3QAAAABBQAAAAxhdWN0aW9uSWRLZXkEAAAADGF1Y3Rpb25TdGF0ZQkAAZEAAAACBQAAAA9hdWN0aW9uRGF0YUxpc3QAAAAAAAAAAAAEAAAAD2F1Y3Rpb25DdXN0b21lcgkAAlkAAAABCQABkQAAAAIFAAAAD2F1Y3Rpb25EYXRhTGlzdAAAAAAAAAAAAQQAAAATYXVjdGlvbklkT3duZXJDaGVjawMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAAA9hdWN0aW9uQ3VzdG9tZXIGCQAAAgAAAAECAAAAJkF1Y3Rpb24gY2FuIGJlIGNhbmNlbGVkIG9ubHkgYnkgb3duZXIuAwkAAAAAAAACBQAAAAxhdWN0aW9uU3RhdGUFAAAACXN0YXRlT3BlbgQAAAAKZGF0YVN0cmluZwkAASwAAAACCQABLAAAAAIJAAEs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", "chainId": 84, "height": 683249, "spentComplexity": 0 } View: original | compacted Prev: CELRGYBHp7rymFnbB5mrNQuEznF64AbNmaCm7zzytQ6G Next: 5qqdtqrjLea7TyQMdcRq9nLE7bfwN3JFxjcTpk9et5Ry Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let auctionTime = 4320
5-
64 let day = 1440
75
86 let comission = 3
4442 let ambassador4 = base58'1'
4543
4644 let ambassador5 = base58'1'
45+
46+func AuctionIdKey (auctionId) = (auctionId + "_Auction")
47+
4748
4849 func getDataList (auctionId) = {
4950 let getDataString = getString(this, auctionId)
8990 func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime)
9091
9192
92-func freezeFunds (pmtAssetName,auctionPrice,dAppCommission) = {
93+func increaseFreezedBalance (pmtAssetName,auctionPrice) = {
9394 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
9495 let currentFreezedBalance = match keyFreezedFunds {
9596 case a: Int =>
9798 case _ =>
9899 0
99100 }
100- ((currentFreezedBalance + auctionPrice) - dAppCommission)
101+ (currentFreezedBalance + auctionPrice)
102+ }
103+
104+
105+func decreaseFreezedBalance (pmtAssetName,auctionPrice) = {
106+ let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
107+ let currentFreezedBalance = match keyFreezedFunds {
108+ case a: Int =>
109+ a
110+ case _ =>
111+ 0
112+ }
113+ let a = (currentFreezedBalance - auctionPrice)
114+ if ((a > 0))
115+ then a
116+ else throw("Freezed amount couldn't be less than 0")
101117 }
102118
103119
113129
114130
115131 @Callable(i)
116-func signUp (info) = {
132+func freelancerSignUp (info) = {
117133 let userPublicKey = toBase58String(i.callerPublicKey)
118- let alreadyRegistered = getString(this, (userPublicKey + "_Registered"))
134+ let alreadyRegistered = getString(this, (userPublicKey + "_Freelancer"))
119135 if (isDefined(alreadyRegistered))
120136 then throw("User already registered")
121137 else WriteSet([DataEntry((userPublicKey + "_Registered"), info)])
124140
125141
126142 @Callable(i)
127-func createAuction (executionDays) = {
143+func clientSignUp (info) = {
144+ let userPublicKey = toBase58String(i.callerPublicKey)
145+ let alreadyRegistered = getString(this, (userPublicKey + "_Client"))
146+ if (isDefined(alreadyRegistered))
147+ then throw("User already registered")
148+ else WriteSet([DataEntry((userPublicKey + "_Client"), info)])
149+ }
150+
151+
152+
153+@Callable(i)
154+func createAuction (jobExecutionDays,auctionDurationDays) = {
128155 let auctionId = toBase58String(i.transactionId)
129156 let auctionCustomer = toBase58String(i.callerPublicKey)
130157 let pmt = extract(i.payment)
131- let auctionPrice = if ((pmt.amount > 0))
132- then pmt.amount
158+ let pmtAmount = pmt.amount
159+ let auctionPrice = if ((pmtAmount > 0))
160+ then pmtAmount
133161 else throw("Amount must be higher then 0")
134162 let auctionStart = height
135- let blocksForExecution = (executionDays * day)
136- let dAppCommission = ((auctionPrice * 3) / 100)
163+ let auctionDurationBlocks = (auctionDurationDays * day)
164+ let blocksForExecution = (jobExecutionDays * day)
137165 let pmtAssetName = if (!(isDefined(pmt.assetId)))
138166 then "WAVES"
139167 else if ((pmt.assetId == wBTC))
143171 else if ((pmt.assetId == wUSD))
144172 then "USD"
145173 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)])
174+ let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
175+ WriteSet([DataEntry(AuctionIdKey(auctionId), ((((((((((((stateOpen + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDurationBlocks)) + "_") + toString(blocksForExecution)) + "_") + pmtAssetName) + "_") + toString(auctionPrice))), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
148176 }
149177
150178
151179
152180 @Callable(i)
153-func makeBet (auctionId,betPrice) = {
154- let pmt = extract(i.payment)
155- let pmtAssetId = pmt.assetId
156- let caller = toBase58String(i.callerPublicKey)
181+func makeBid (auctionId,betPrice) = {
182+ let callerPub = toBase58String(i.callerPublicKey)
157183 let betTime = height
158- let auctionDataList = getDataList(auctionId)
184+ let auctionIdKey = AuctionIdKey(auctionId)
185+ let auctionDataList = getDataList(auctionIdKey)
159186 let auctionState = auctionDataList[0]
160187 let auctionCustomer = fromBase58String(auctionDataList[1])
161188 let auctionStart = parseIntValue(auctionDataList[2])
162- let auctionAssetName = auctionDataList[4]
163- let auctionPrice = parseIntValue(auctionDataList[5])
189+ let auctionDuration = parseIntValue(auctionDataList[3])
190+ let auctionBlocksForExecution = parseIntValue(auctionDataList[4])
191+ let auctionAssetName = auctionDataList[5]
192+ let auctionPrice = parseIntValue(auctionDataList[6])
164193 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))
194+ let newBid = betPriceCheck(betPrice, auctionPrice)
195+ let newFreelancer = freelancerIsRegistered(callerPub)
196+ let dAppCommission = ((auctionPrice * 3) / 100)
197+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
198+ let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
199+ if (auctionTimeisOver)
200+ then if ((auctionState == stateOpen))
201+ then ScriptResult(WriteSet([DataEntry(auctionIdKey, ((((((((((((((((stateCancel + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + "NoFreelancer") + "_") + "NoBid")), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionCustomer), (auctionPrice - dAppCommission), auctionAssetId58)]))
202+ else if ((auctionState == stateSuggested))
203+ then {
204+ let auctionFreelancer = auctionDataList[7]
205+ let auctionJobCost = auctionDataList[8]
206+ WriteSet([DataEntry(auctionIdKey, ((((((((((((((((stateInProgress + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + auctionFreelancer) + "_") + auctionJobCost))])
207+ }
208+ else throw("Incorrect auction state")
209+ else if ((auctionState == stateOpen))
210+ then WriteSet([DataEntry(((auctionId + "_") + newFreelancer), betPrice), DataEntry(auctionIdKey, ((((((((((((((stateSuggested + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + newFreelancer))])
211+ else if ((auctionState == stateSuggested))
212+ then {
213+ let auctionLowestBidder = auctionDataList[7]
214+ let newAuctionLowestBidder = {
215+ let keyCurrentLowestBid = ((auctionId + "_") + auctionLowestBidder)
216+ let valueCurrentLowestBid = getInteger(this, keyCurrentLowestBid)
217+ let currentLowestBid = match valueCurrentLowestBid {
218+ case a: Int =>
219+ a
220+ case _ =>
221+ throw("Can't find lowest bid by public key")
222+ }
223+ if ((currentLowestBid > newBid))
224+ then newFreelancer
225+ else auctionLowestBidder
226+ }
227+ WriteSet([DataEntry(((auctionId + "_") + callerPub), betPrice), DataEntry(auctionIdKey, ((((((((((((((stateSuggested + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + newAuctionLowestBidder))])
228+ }
229+ else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested))
230+ }
231+
232+
233+
234+@Callable(i)
235+func chooseFreelancer (auctionId,freelancerPub) = {
236+ let callerPub = toBase58String(i.callerPublicKey)
237+ let betTime = height
238+ let auctionIdKey = AuctionIdKey(auctionId)
239+ let auctionDataList = getDataList(auctionIdKey)
240+ let auctionState = auctionDataList[0]
241+ let auctionCustomer = auctionDataList[1]
242+ let auctionStart = parseIntValue(auctionDataList[2])
243+ let auctionDuration = parseIntValue(auctionDataList[3])
244+ let auctionBlocksForExecution = parseIntValue(auctionDataList[4])
245+ let auctionAssetName = auctionDataList[5]
246+ let auctionPrice = parseIntValue(auctionDataList[6])
247+ let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
248+ let FreelancerBidAmount = {
249+ let keyFreelancerBid = ((auctionId + "_") + freelancerPub)
250+ let valueFreelacerBid = getInteger(this, keyFreelancerBid)
251+ match valueFreelacerBid {
252+ case a: Int =>
253+ a
254+ case _ =>
255+ throw("Freelancer's bet was not found")
256+ }
257+ }
258+ let dAppCommission = ((auctionPrice * 3) / 100)
259+ let amountDifference = ((auctionPrice - FreelancerBidAmount) - dAppCommission)
260+ let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
261+ if ((callerPub == auctionCustomer))
178262 then if (auctionTimeisOver)
179263 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- }
264+ then ScriptResult(WriteSet([DataEntry(auctionIdKey, ((((((((((((((((stateCancel + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + "NoFreelancer") + "_") + "NoBid"))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionCustomer)), (auctionPrice - dAppCommission), auctionAssetId58)]))
185265 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))
266+ then WriteSet([DataEntry(auctionIdKey, ((((((((((((stateInProgress + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)))])
267+ else throw("Incorrect auction state")
268+ else ScriptResult(WriteSet([DataEntry(auctionIdKey, ((((((((((((((stateInProgress + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(FreelancerBidAmount)) + "_") + freelancerPub))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionCustomer)), amountDifference, auctionAssetId58)]))
269+ else throw("Only auction customer can choose a freelancer")
200270 }
201271
202272
204274 @Callable(i)
205275 func increaseExecutionTime (auctionId,executionDays) = {
206276 let caller = toBase58String(i.callerPublicKey)
207- let auctionDataList = getDataList(auctionId)
277+ let auctionIdKey = AuctionIdKey(auctionId)
278+ let auctionDataList = getDataList(auctionIdKey)
208279 let auctionState = auctionDataList[0]
209280 let auctionCustomer = auctionDataList[1]
210281 let auctionExecutionTime = parseIntValue(auctionDataList[3])
222293 else (auctionState == stateInProgress))
223294 then {
224295 let newDataString = ((((((((((((auctionState + "_") + auctionCustomer) + "_") + auctionDataList[2]) + "_") + toString(newAuctionExecutionTime)) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
225- WriteSet([DataEntry(auctionId, newDataString)])
296+ WriteSet([DataEntry(auctionIdKey, newDataString)])
226297 }
227298 else throw("Incorrect state")
228299 else throw("Only customer can increase execution time")
232303
233304 @Callable(i)
234305 func cancelAuction (auctionId) = {
235- let auctionDataList = getDataList(auctionId)
306+ let auctionIdKey = AuctionIdKey(auctionId)
307+ let auctionDataList = getDataList(auctionIdKey)
236308 let auctionState = auctionDataList[0]
237309 let auctionCustomer = fromBase58String(auctionDataList[1])
238310 let auctionIdOwnerCheck = if ((i.callerPublicKey == auctionCustomer))
241313 if ((auctionState == stateOpen))
242314 then {
243315 let dataString = ((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5])
244- WriteSet([DataEntry(auctionId, ((stateCancel + "_") + dataString))])
316+ WriteSet([DataEntry(auctionIdKey, ((stateCancel + "_") + dataString))])
245317 }
246318 else throw("Incorrect auction state.")
247319 }
251323 @Callable(i)
252324 func openDispute (auctionId) = {
253325 let caller = toBase58String(i.callerPublicKey)
254- let auctionDataList = getDataList(auctionId)
326+ let auctionIdKey = AuctionIdKey(auctionId)
327+ let auctionDataList = getDataList(auctionIdKey)
255328 let auctionState = auctionDataList[0]
256329 let auctionCustomer = auctionDataList[1]
257330 let auctionFreelancer = auctionDataList[6]
260333 else (caller == auctionFreelancer))
261334 then {
262335 let dataString = "1"
263- WriteSet([DataEntry(auctionId, (stateDispute + dataString)), DataEntry((auctionId + "_Dispute"), "0")])
336+ WriteSet([DataEntry(auctionIdKey, (stateDispute + dataString)), DataEntry((auctionId + "_Dispute"), "0")])
264337 }
265338 else throw("Only customer and freelancer can open dispute")
266339 }
269342
270343 @Callable(i)
271344 func voteDispute (auctionId,vote) = {
272- let auctionDataList = getDataList(auctionId)
345+ let auctionIdKey = AuctionIdKey(auctionId)
346+ let auctionDataList = getDataList(auctionIdKey)
273347 let auctionStateCheck = {
274348 let auctionState = auctionDataList[0]
275349 if ((auctionState == stateDispute))
346420 then auctionDataList[1]
347421 else auctionDataList[6]
348422 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))]))
423+ ScriptResult(WriteSet([DataEntry(AuctionIdKey(auctionId), (stateDisputeResolved + newDataString)), DataEntry(((auctionId + "_") + stateDispute), newDisputeDataString)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(DisputeWinnerAddress)), amountWithoutComm, fromBase58String(auctionAssetId))]))
350424 }
351425 }
352426 else {
418492
419493 @Callable(i)
420494 func workIsDone (auctionId) = {
421- let auctionDataList = getDataList(auctionId)
495+ let auctionIdKey = AuctionIdKey(auctionId)
496+ let auctionDataList = getDataList(auctionIdKey)
422497 let auctionState = auctionDataList[0]
423498 let auctionStart = parseIntValue(auctionDataList[2])
424499 let auctionExecutionTime = parseIntValue(auctionDataList[3])
435510 then if (timeIsOver)
436511 then {
437512 let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
438- WriteSet([DataEntry(auctionId, (stateDispute + newDataString))])
513+ WriteSet([DataEntry(auctionIdKey, (stateDispute + newDataString))])
439514 }
440515 else {
441516 let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
442- WriteSet([DataEntry(auctionId, (stateWait4Confirm + newDataString))])
517+ WriteSet([DataEntry(auctionIdKey, (stateWait4Confirm + newDataString))])
443518 }
444519 else throw("Auction state is incorrect")
445520 }
448523
449524 @Callable(i)
450525 func acceptByCustomer (auctionId) = {
451- let auctionDataList = getDataList(auctionId)
526+ let auctionIdKey = AuctionIdKey(auctionId)
527+ let auctionDataList = getDataList(auctionIdKey)
452528 let auctionState = auctionDataList[0]
453529 let auctionCustomer = auctionDataList[1]
454530 let auctionAssetName = auctionDataList[4]
472548 then if ((auctionState == stateWait4Confirm))
473549 then {
474550 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)]))
551+ ScriptResult(WriteSet([DataEntry(auctionIdKey, (stateComplete + newDataString)), DataEntry((auctionFreelancer + "_Rating"), newRating)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionFreelancer)), amountWithoutComm, auctionAssetId58)]))
476552 }
477553 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
478554 else throw("Only auction customer can use this function")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let auctionTime = 4320
5-
64 let day = 1440
75
86 let comission = 3
97
108 let WAVES = unit
119
1210 let wBTC = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
1311
1412 let wEUR = base58'Gtb1WRznfchDnTh37ezoDTJ4wcoKaRsKqKjJjy7nm2zU'
1513
1614 let wUSD = base58'Ft8X1v1LTa1ABafufpaCWyVj8KkaxUWE6xBhW6sNFJck'
1715
1816 let stateOpen = "Opened"
1917
2018 let stateSuggested = "Suggested"
2119
2220 let stateCancel = "Canceled"
2321
2422 let stateInProgress = "InProgress"
2523
2624 let stateWait4Confirm = "WaitForConfirmation"
2725
2826 let stateComplete = "Completed"
2927
3028 let stateDispute = "Dispute"
3129
3230 let stateDisputeResolved = "DisputeResolved"
3331
3432 let customer = "CMR"
3533
3634 let freelancer = "FL"
3735
3836 let ambassador1 = base58'1'
3937
4038 let ambassador2 = base58'1'
4139
4240 let ambassador3 = base58'1'
4341
4442 let ambassador4 = base58'1'
4543
4644 let ambassador5 = base58'1'
45+
46+func AuctionIdKey (auctionId) = (auctionId + "_Auction")
47+
4748
4849 func getDataList (auctionId) = {
4950 let getDataString = getString(this, auctionId)
5051 let a = match getDataString {
5152 case a: String =>
5253 a
5354 case _ =>
5455 throw("AuctionId was not found")
5556 }
5657 split(a, "_")
5758 }
5859
5960
6061 func getDisputeDataList (auctionId) = {
6162 let keyDisputeData = ((auctionId + "_") + stateDispute)
6263 let getDisputeDataString = getString(this, keyDisputeData)
6364 let a = match getDisputeDataString {
6465 case a: String =>
6566 a
6667 case _ =>
6768 throw("Dispute data was not found")
6869 }
6970 split(a, "/")
7071 }
7172
7273
7374 func AssetNameToBase58 (auctionAssetName) = if ((auctionAssetName == "WAVES"))
7475 then WAVES
7576 else if ((auctionAssetName == "BTC"))
7677 then wBTC
7778 else if ((auctionAssetName == "EUR"))
7879 then wEUR
7980 else if ((auctionAssetName == "USD"))
8081 then wUSD
8182 else throw("Incorrect Asset Id")
8283
8384
8485 func betPriceCheck (betPrice,auctionPrice) = if ((auctionPrice > betPrice))
8586 then betPrice
8687 else throw(("Bet price must be lower than actual price. Actual price: " + toString(auctionPrice)))
8788
8889
8990 func timeCheck (currentTime,startTime,expirationTime) = ((currentTime - startTime) > expirationTime)
9091
9192
92-func freezeFunds (pmtAssetName,auctionPrice,dAppCommission) = {
93+func increaseFreezedBalance (pmtAssetName,auctionPrice) = {
9394 let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
9495 let currentFreezedBalance = match keyFreezedFunds {
9596 case a: Int =>
9697 a
9798 case _ =>
9899 0
99100 }
100- ((currentFreezedBalance + auctionPrice) - dAppCommission)
101+ (currentFreezedBalance + auctionPrice)
102+ }
103+
104+
105+func decreaseFreezedBalance (pmtAssetName,auctionPrice) = {
106+ let keyFreezedFunds = getInteger(this, (pmtAssetName + "_Freezed"))
107+ let currentFreezedBalance = match keyFreezedFunds {
108+ case a: Int =>
109+ a
110+ case _ =>
111+ 0
112+ }
113+ let a = (currentFreezedBalance - auctionPrice)
114+ if ((a > 0))
115+ then a
116+ else throw("Freezed amount couldn't be less than 0")
101117 }
102118
103119
104120 func freelancerIsRegistered (caller) = {
105121 let freelancerIsRegistered = getString(this, (caller + "_Status"))
106122 match freelancerIsRegistered {
107123 case a: String =>
108124 a
109125 case _ =>
110126 throw("Only registered users can make bets")
111127 }
112128 }
113129
114130
115131 @Callable(i)
116-func signUp (info) = {
132+func freelancerSignUp (info) = {
117133 let userPublicKey = toBase58String(i.callerPublicKey)
118- let alreadyRegistered = getString(this, (userPublicKey + "_Registered"))
134+ let alreadyRegistered = getString(this, (userPublicKey + "_Freelancer"))
119135 if (isDefined(alreadyRegistered))
120136 then throw("User already registered")
121137 else WriteSet([DataEntry((userPublicKey + "_Registered"), info)])
122138 }
123139
124140
125141
126142 @Callable(i)
127-func createAuction (executionDays) = {
143+func clientSignUp (info) = {
144+ let userPublicKey = toBase58String(i.callerPublicKey)
145+ let alreadyRegistered = getString(this, (userPublicKey + "_Client"))
146+ if (isDefined(alreadyRegistered))
147+ then throw("User already registered")
148+ else WriteSet([DataEntry((userPublicKey + "_Client"), info)])
149+ }
150+
151+
152+
153+@Callable(i)
154+func createAuction (jobExecutionDays,auctionDurationDays) = {
128155 let auctionId = toBase58String(i.transactionId)
129156 let auctionCustomer = toBase58String(i.callerPublicKey)
130157 let pmt = extract(i.payment)
131- let auctionPrice = if ((pmt.amount > 0))
132- then pmt.amount
158+ let pmtAmount = pmt.amount
159+ let auctionPrice = if ((pmtAmount > 0))
160+ then pmtAmount
133161 else throw("Amount must be higher then 0")
134162 let auctionStart = height
135- let blocksForExecution = (executionDays * day)
136- let dAppCommission = ((auctionPrice * 3) / 100)
163+ let auctionDurationBlocks = (auctionDurationDays * day)
164+ let blocksForExecution = (jobExecutionDays * day)
137165 let pmtAssetName = if (!(isDefined(pmt.assetId)))
138166 then "WAVES"
139167 else if ((pmt.assetId == wBTC))
140168 then "BTC"
141169 else if ((pmt.assetId == wEUR))
142170 then "EUR"
143171 else if ((pmt.assetId == wUSD))
144172 then "USD"
145173 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)])
174+ let newFreezedBalance = increaseFreezedBalance(pmtAssetName, auctionPrice)
175+ WriteSet([DataEntry(AuctionIdKey(auctionId), ((((((((((((stateOpen + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDurationBlocks)) + "_") + toString(blocksForExecution)) + "_") + pmtAssetName) + "_") + toString(auctionPrice))), DataEntry((pmtAssetName + "_Freezed"), newFreezedBalance)])
148176 }
149177
150178
151179
152180 @Callable(i)
153-func makeBet (auctionId,betPrice) = {
154- let pmt = extract(i.payment)
155- let pmtAssetId = pmt.assetId
156- let caller = toBase58String(i.callerPublicKey)
181+func makeBid (auctionId,betPrice) = {
182+ let callerPub = toBase58String(i.callerPublicKey)
157183 let betTime = height
158- let auctionDataList = getDataList(auctionId)
184+ let auctionIdKey = AuctionIdKey(auctionId)
185+ let auctionDataList = getDataList(auctionIdKey)
159186 let auctionState = auctionDataList[0]
160187 let auctionCustomer = fromBase58String(auctionDataList[1])
161188 let auctionStart = parseIntValue(auctionDataList[2])
162- let auctionAssetName = auctionDataList[4]
163- let auctionPrice = parseIntValue(auctionDataList[5])
189+ let auctionDuration = parseIntValue(auctionDataList[3])
190+ let auctionBlocksForExecution = parseIntValue(auctionDataList[4])
191+ let auctionAssetName = auctionDataList[5]
192+ let auctionPrice = parseIntValue(auctionDataList[6])
164193 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))
194+ let newBid = betPriceCheck(betPrice, auctionPrice)
195+ let newFreelancer = freelancerIsRegistered(callerPub)
196+ let dAppCommission = ((auctionPrice * 3) / 100)
197+ let newFreezedBalance = decreaseFreezedBalance(auctionAssetName, auctionPrice)
198+ let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
199+ if (auctionTimeisOver)
200+ then if ((auctionState == stateOpen))
201+ then ScriptResult(WriteSet([DataEntry(auctionIdKey, ((((((((((((((((stateCancel + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + "NoFreelancer") + "_") + "NoBid")), DataEntry((auctionAssetName + "_Freezed"), newFreezedBalance)]), TransferSet([ScriptTransfer(addressFromPublicKey(auctionCustomer), (auctionPrice - dAppCommission), auctionAssetId58)]))
202+ else if ((auctionState == stateSuggested))
203+ then {
204+ let auctionFreelancer = auctionDataList[7]
205+ let auctionJobCost = auctionDataList[8]
206+ WriteSet([DataEntry(auctionIdKey, ((((((((((((((((stateInProgress + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + auctionFreelancer) + "_") + auctionJobCost))])
207+ }
208+ else throw("Incorrect auction state")
209+ else if ((auctionState == stateOpen))
210+ then WriteSet([DataEntry(((auctionId + "_") + newFreelancer), betPrice), DataEntry(auctionIdKey, ((((((((((((((stateSuggested + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + newFreelancer))])
211+ else if ((auctionState == stateSuggested))
212+ then {
213+ let auctionLowestBidder = auctionDataList[7]
214+ let newAuctionLowestBidder = {
215+ let keyCurrentLowestBid = ((auctionId + "_") + auctionLowestBidder)
216+ let valueCurrentLowestBid = getInteger(this, keyCurrentLowestBid)
217+ let currentLowestBid = match valueCurrentLowestBid {
218+ case a: Int =>
219+ a
220+ case _ =>
221+ throw("Can't find lowest bid by public key")
222+ }
223+ if ((currentLowestBid > newBid))
224+ then newFreelancer
225+ else auctionLowestBidder
226+ }
227+ WriteSet([DataEntry(((auctionId + "_") + callerPub), betPrice), DataEntry(auctionIdKey, ((((((((((((((stateSuggested + "_") + toBase58String(auctionCustomer)) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + newAuctionLowestBidder))])
228+ }
229+ else throw(((((("Incorrect jobId state. Now: " + auctionState) + ", must be: ") + stateOpen) + " or ") + stateSuggested))
230+ }
231+
232+
233+
234+@Callable(i)
235+func chooseFreelancer (auctionId,freelancerPub) = {
236+ let callerPub = toBase58String(i.callerPublicKey)
237+ let betTime = height
238+ let auctionIdKey = AuctionIdKey(auctionId)
239+ let auctionDataList = getDataList(auctionIdKey)
240+ let auctionState = auctionDataList[0]
241+ let auctionCustomer = auctionDataList[1]
242+ let auctionStart = parseIntValue(auctionDataList[2])
243+ let auctionDuration = parseIntValue(auctionDataList[3])
244+ let auctionBlocksForExecution = parseIntValue(auctionDataList[4])
245+ let auctionAssetName = auctionDataList[5]
246+ let auctionPrice = parseIntValue(auctionDataList[6])
247+ let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
248+ let FreelancerBidAmount = {
249+ let keyFreelancerBid = ((auctionId + "_") + freelancerPub)
250+ let valueFreelacerBid = getInteger(this, keyFreelancerBid)
251+ match valueFreelacerBid {
252+ case a: Int =>
253+ a
254+ case _ =>
255+ throw("Freelancer's bet was not found")
256+ }
257+ }
258+ let dAppCommission = ((auctionPrice * 3) / 100)
259+ let amountDifference = ((auctionPrice - FreelancerBidAmount) - dAppCommission)
260+ let auctionTimeisOver = timeCheck(betTime, auctionStart, auctionDuration)
261+ if ((callerPub == auctionCustomer))
178262 then if (auctionTimeisOver)
179263 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- }
264+ then ScriptResult(WriteSet([DataEntry(auctionIdKey, ((((((((((((((((stateCancel + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)) + "_") + "NoFreelancer") + "_") + "NoBid"))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionCustomer)), (auctionPrice - dAppCommission), auctionAssetId58)]))
185265 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))
266+ then WriteSet([DataEntry(auctionIdKey, ((((((((((((stateInProgress + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(auctionPrice)))])
267+ else throw("Incorrect auction state")
268+ else ScriptResult(WriteSet([DataEntry(auctionIdKey, ((((((((((((((stateInProgress + "_") + auctionCustomer) + "_") + toString(auctionStart)) + "_") + toString(auctionDuration)) + "_") + toString(auctionBlocksForExecution)) + "_") + auctionAssetName) + "_") + toString(FreelancerBidAmount)) + "_") + freelancerPub))]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionCustomer)), amountDifference, auctionAssetId58)]))
269+ else throw("Only auction customer can choose a freelancer")
200270 }
201271
202272
203273
204274 @Callable(i)
205275 func increaseExecutionTime (auctionId,executionDays) = {
206276 let caller = toBase58String(i.callerPublicKey)
207- let auctionDataList = getDataList(auctionId)
277+ let auctionIdKey = AuctionIdKey(auctionId)
278+ let auctionDataList = getDataList(auctionIdKey)
208279 let auctionState = auctionDataList[0]
209280 let auctionCustomer = auctionDataList[1]
210281 let auctionExecutionTime = parseIntValue(auctionDataList[3])
211282 let newAuctionExecutionTime = {
212283 let newExecutionTime = (executionDays * day)
213284 if ((newExecutionTime > auctionExecutionTime))
214285 then newExecutionTime
215286 else throw("New execution time must more than current execution time")
216287 }
217288 if ((caller == auctionCustomer))
218289 then if (if (if ((auctionState == stateOpen))
219290 then true
220291 else (auctionState == stateSuggested))
221292 then true
222293 else (auctionState == stateInProgress))
223294 then {
224295 let newDataString = ((((((((((((auctionState + "_") + auctionCustomer) + "_") + auctionDataList[2]) + "_") + toString(newAuctionExecutionTime)) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
225- WriteSet([DataEntry(auctionId, newDataString)])
296+ WriteSet([DataEntry(auctionIdKey, newDataString)])
226297 }
227298 else throw("Incorrect state")
228299 else throw("Only customer can increase execution time")
229300 }
230301
231302
232303
233304 @Callable(i)
234305 func cancelAuction (auctionId) = {
235- let auctionDataList = getDataList(auctionId)
306+ let auctionIdKey = AuctionIdKey(auctionId)
307+ let auctionDataList = getDataList(auctionIdKey)
236308 let auctionState = auctionDataList[0]
237309 let auctionCustomer = fromBase58String(auctionDataList[1])
238310 let auctionIdOwnerCheck = if ((i.callerPublicKey == auctionCustomer))
239311 then true
240312 else throw("Auction can be canceled only by owner.")
241313 if ((auctionState == stateOpen))
242314 then {
243315 let dataString = ((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5])
244- WriteSet([DataEntry(auctionId, ((stateCancel + "_") + dataString))])
316+ WriteSet([DataEntry(auctionIdKey, ((stateCancel + "_") + dataString))])
245317 }
246318 else throw("Incorrect auction state.")
247319 }
248320
249321
250322
251323 @Callable(i)
252324 func openDispute (auctionId) = {
253325 let caller = toBase58String(i.callerPublicKey)
254- let auctionDataList = getDataList(auctionId)
326+ let auctionIdKey = AuctionIdKey(auctionId)
327+ let auctionDataList = getDataList(auctionIdKey)
255328 let auctionState = auctionDataList[0]
256329 let auctionCustomer = auctionDataList[1]
257330 let auctionFreelancer = auctionDataList[6]
258331 if (if ((caller == auctionCustomer))
259332 then true
260333 else (caller == auctionFreelancer))
261334 then {
262335 let dataString = "1"
263- WriteSet([DataEntry(auctionId, (stateDispute + dataString)), DataEntry((auctionId + "_Dispute"), "0")])
336+ WriteSet([DataEntry(auctionIdKey, (stateDispute + dataString)), DataEntry((auctionId + "_Dispute"), "0")])
264337 }
265338 else throw("Only customer and freelancer can open dispute")
266339 }
267340
268341
269342
270343 @Callable(i)
271344 func voteDispute (auctionId,vote) = {
272- let auctionDataList = getDataList(auctionId)
345+ let auctionIdKey = AuctionIdKey(auctionId)
346+ let auctionDataList = getDataList(auctionIdKey)
273347 let auctionStateCheck = {
274348 let auctionState = auctionDataList[0]
275349 if ((auctionState == stateDispute))
276350 then true
277351 else throw(("Incorrect state. Must be: " + stateDispute))
278352 }
279353 let auctionAssetId = auctionDataList[4]
280354 let auctionPrice = parseIntValue(auctionDataList[5])
281355 let newVote = if (if ((vote == customer))
282356 then true
283357 else (vote == freelancer))
284358 then vote
285359 else throw(((("Vote is incorrect. Must be: " + customer) + " or ") + freelancer))
286360 let newVoter = if (if (if (if (if ((i.callerPublicKey == ambassador1))
287361 then true
288362 else (i.callerPublicKey == ambassador2))
289363 then true
290364 else (i.callerPublicKey == ambassador3))
291365 then true
292366 else (i.callerPublicKey == ambassador4))
293367 then true
294368 else (i.callerPublicKey == ambassador5))
295369 then toBase58String(i.callerPublicKey)
296370 else throw("You have no rights for disputes resolving")
297371 let disputeData = {
298372 let keyDispute = ((auctionId + "_") + stateDispute)
299373 let valueDispute = getString(this, keyDispute)
300374 match valueDispute {
301375 case a: String =>
302376 a
303377 case _ =>
304378 throw("Cannot find data of dispute in storage")
305379 }
306380 }
307381 let disputeDataList = split(disputeData, "/")
308382 let votesCounter = disputeDataList[0]
309383 if ((votesCounter == "4"))
310384 then {
311385 let votersList = split(disputeDataList[1], "_")
312386 let votesList = split(disputeDataList[2], "_")
313387 let alreadyVoted = if ((newVoter == votersList[0]))
314388 then true
315389 else (newVoter == votersList[1])
316390 if (alreadyVoted)
317391 then throw("You already voted")
318392 else {
319393 let newVotesCounter = "5"
320394 let newVoters = ((disputeDataList[1] + "_") + newVoter)
321395 let newVotes = ((disputeDataList[2] + "_") + newVote)
322396 let newDisputeDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes)
323397 let disputeWinner = {
324398 let vote1 = if ((votesList[0] == customer))
325399 then 1
326400 else 0
327401 let vote2 = if ((votesList[1] == customer))
328402 then 1
329403 else 0
330404 let vote3 = if ((votesList[2] == customer))
331405 then 1
332406 else 0
333407 let vote4 = if ((votesList[3] == customer))
334408 then 1
335409 else 0
336410 let vote5 = if ((newVote == customer))
337411 then 1
338412 else 0
339413 let customerVotes = ((((vote1 + vote2) + vote3) + vote4) + vote5)
340414 if ((customerVotes > 2))
341415 then customer
342416 else freelancer
343417 }
344418 let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
345419 let DisputeWinnerAddress = if ((disputeWinner == customer))
346420 then auctionDataList[1]
347421 else auctionDataList[6]
348422 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))]))
423+ ScriptResult(WriteSet([DataEntry(AuctionIdKey(auctionId), (stateDisputeResolved + newDataString)), DataEntry(((auctionId + "_") + stateDispute), newDisputeDataString)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(DisputeWinnerAddress)), amountWithoutComm, fromBase58String(auctionAssetId))]))
350424 }
351425 }
352426 else {
353427 let newDisputeDataString = if ((votesCounter == "0"))
354428 then {
355429 let newVotesCounter = "1"
356430 let newVoters = newVoter
357431 let newVotes = newVote
358432 let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes)
359433 newDataString
360434 }
361435 else if ((votesCounter == "1"))
362436 then {
363437 let voter1 = disputeDataList[1]
364438 let vote1 = disputeDataList[2]
365439 let alreadyVoted = (newVoter == voter1)
366440 if (alreadyVoted)
367441 then throw("You already voted")
368442 else {
369443 let newVotesCounter = "1"
370444 let newVoters = (voter1 + newVoter)
371445 let newVotes = (vote1 + newVote)
372446 let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes)
373447 newDataString
374448 }
375449 }
376450 else if ((votesCounter == "2"))
377451 then {
378452 let votersList = split(disputeDataList[1], "_")
379453 let votesList = split(disputeDataList[2], "_")
380454 let alreadyVoted = if ((newVoter == votersList[0]))
381455 then true
382456 else (newVoter == votersList[1])
383457 if (alreadyVoted)
384458 then throw("You already voted")
385459 else {
386460 let newVotesCounter = "3"
387461 let newVoters = ((disputeDataList[1] + "_") + newVoter)
388462 let newVotes = ((disputeDataList[2] + "_") + newVote)
389463 let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes)
390464 newDataString
391465 }
392466 }
393467 else if ((votesCounter == "3"))
394468 then {
395469 let votersList = split(disputeDataList[1], "_")
396470 let votesList = split(disputeDataList[2], "_")
397471 let alreadyVoted = if (if ((newVoter == votersList[0]))
398472 then true
399473 else (newVoter == votersList[1]))
400474 then true
401475 else (newVoter == votersList[2])
402476 if (alreadyVoted)
403477 then throw("You already voted")
404478 else {
405479 let newVotesCounter = "4"
406480 let newVoters = ((disputeDataList[1] + "_") + newVoter)
407481 let newVotes = ((disputeDataList[2] + "_") + newVote)
408482 let newDataString = ((((newVotesCounter + "/") + newVoters) + "/") + newVotes)
409483 newDataString
410484 }
411485 }
412486 else throw("Dispute has been already resolved")
413487 WriteSet([DataEntry(((auctionId + "_") + stateDispute), newDisputeDataString)])
414488 }
415489 }
416490
417491
418492
419493 @Callable(i)
420494 func workIsDone (auctionId) = {
421- let auctionDataList = getDataList(auctionId)
495+ let auctionIdKey = AuctionIdKey(auctionId)
496+ let auctionDataList = getDataList(auctionIdKey)
422497 let auctionState = auctionDataList[0]
423498 let auctionStart = parseIntValue(auctionDataList[2])
424499 let auctionExecutionTime = parseIntValue(auctionDataList[3])
425500 let currentTime = height
426501 let freelancerPubCheck = {
427502 let caller = toBase58String(i.callerPublicKey)
428503 let auctionFreelancer = auctionDataList[6]
429504 if ((caller == auctionFreelancer))
430505 then caller
431506 else throw("Only a freelancer can indicate that the work is done")
432507 }
433508 let timeIsOver = ((currentTime - auctionStart) > auctionExecutionTime)
434509 if ((auctionState == stateInProgress))
435510 then if (timeIsOver)
436511 then {
437512 let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
438- WriteSet([DataEntry(auctionId, (stateDispute + newDataString))])
513+ WriteSet([DataEntry(auctionIdKey, (stateDispute + newDataString))])
439514 }
440515 else {
441516 let newDataString = ((((((((((auctionDataList[1] + "_") + auctionDataList[2]) + "_") + auctionDataList[3]) + "_") + auctionDataList[4]) + "_") + auctionDataList[5]) + "_") + auctionDataList[6])
442- WriteSet([DataEntry(auctionId, (stateWait4Confirm + newDataString))])
517+ WriteSet([DataEntry(auctionIdKey, (stateWait4Confirm + newDataString))])
443518 }
444519 else throw("Auction state is incorrect")
445520 }
446521
447522
448523
449524 @Callable(i)
450525 func acceptByCustomer (auctionId) = {
451- let auctionDataList = getDataList(auctionId)
526+ let auctionIdKey = AuctionIdKey(auctionId)
527+ let auctionDataList = getDataList(auctionIdKey)
452528 let auctionState = auctionDataList[0]
453529 let auctionCustomer = auctionDataList[1]
454530 let auctionAssetName = auctionDataList[4]
455531 let auctionPrice = parseIntValue(auctionDataList[5])
456532 let auctionFreelancer = auctionDataList[6]
457533 let caller = toBase58String(i.callerPublicKey)
458534 let dAppCommission = ((auctionPrice * 3) / 100)
459535 let amountWithoutComm = (auctionPrice - dAppCommission)
460536 let auctionAssetId58 = AssetNameToBase58(auctionAssetName)
461537 let newRating = {
462538 let valueRating = getInteger(this, (auctionFreelancer + "_Rating"))
463539 let currentRating = match valueRating {
464540 case a: Int =>
465541 a
466542 case _ =>
467543 0
468544 }
469545 (currentRating + 1)
470546 }
471547 if ((caller == auctionCustomer))
472548 then if ((auctionState == stateWait4Confirm))
473549 then {
474550 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)]))
551+ ScriptResult(WriteSet([DataEntry(auctionIdKey, (stateComplete + newDataString)), DataEntry((auctionFreelancer + "_Rating"), newRating)]), TransferSet([ScriptTransfer(addressFromPublicKey(fromBase58String(auctionFreelancer)), amountWithoutComm, auctionAssetId58)]))
476552 }
477553 else throw(("Incorrect state. Must be: " + stateWait4Confirm))
478554 else throw("Only auction customer can use this function")
479555 }
480556
481557
482558 @Verifier(tx)
483559 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
484560 then match tx {
485561 case ttx: TransferTransaction =>
486562 true
487563 case stx: SetScriptTransaction =>
488564 true
489565 case _ =>
490566 false
491567 }
492568 else false
493569

github/deemru/w8io/026f985 
71.11 ms