tx · 7Lep4Rd7gRnjTvNbfeVPCfRQFc2t6Duy95ey9BfvgdV1

3NC8pQxcnDTtDkhzv5Eje8qqW4qoFawLnAb:  -0.01400000 Waves

2019.09.09 22:21 [668964] smart account 3NC8pQxcnDTtDkhzv5Eje8qqW4qoFawLnAb > SELF 0.00000000 Waves

{ "type": 13, "id": "7Lep4Rd7gRnjTvNbfeVPCfRQFc2t6Duy95ey9BfvgdV1", "fee": 1400000, "feeAssetId": null, "timestamp": 1568056926877, "version": 1, "sender": "3NC8pQxcnDTtDkhzv5Eje8qqW4qoFawLnAb", "senderPublicKey": "5vyi92HdgdTabKCQzDHGrgQ4ASjtoT3XrCUXr459sWuc", "proofs": [ "3mGPFTNYaKubeHDw7aQK4EXYgdkoFAFvabihTp6L3WHtAKWgecv1HQNXAimbGmXSk596Akh63fwPdaH347gy8BhK" ], "script": "base64:AAIDAAAAAAAAAAAAAAAcAAAAAAROT05FAgAAAAABAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEFAAAABE5PTkUAAAAADE9yZGVyQm9va0tleQIAAAAJb3JkZXJib29rAAAAAA1PcmRlclByaWNlS2V5AgAAAAxvcmRlcl9wcmljZV8AAAAADU9yZGVyVG90YWxLZXkCAAAADG9yZGVyX3RvdGFsXwAAAAATT3JkZXJGaWxsZWRUb3RhbEtleQIAAAATb3JkZXJfZmlsbGVkX3RvdGFsXwAAAAANT3JkZXJPd25lcktleQIAAAAMb3JkZXJfb3duZXJfAAAAAA5PcmRlckhlaWdodEtleQIAAAANb3JkZXJfaGVpZ2h0XwAAAAAOT3JkZXJTdGF0dXNLZXkCAAAADW9yZGVyX3N0YXR1c18AAAAADkJvbmRBc3NldElkS2V5AgAAAA1ib25kX2Fzc2V0X2lkAAAAABJOZXV0cmlub0Fzc2V0SWRLZXkCAAAAEW5ldXRyaW5vX2Fzc2V0X2lkAAAAABNOZXV0cmlub0NvbnRyYWN0S2V5AgAAABFuZXV0cmlub19jb250cmFjdAAAAAAJb3JkZXJib29rCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAAxPcmRlckJvb2tLZXkBAAAADWdldE9yZGVyUHJpY2UAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQABLAAAAAIFAAAADU9yZGVyUHJpY2VLZXkFAAAAAmlkAQAAAA1nZXRPcmRlclRvdGFsAAAAAQAAAAJpZAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkAASwAAAACBQAAAA1PcmRlclRvdGFsS2V5BQAAAAJpZAEAAAANZ2V0T3JkZXJPd25lcgAAAAEAAAACaWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAAEsAAAAAgUAAAANT3JkZXJPd25lcktleQUAAAACaWQBAAAADmdldE9yZGVyU3RhdHVzAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkAASwAAAACBQAAAA5PcmRlclN0YXR1c0tleQUAAAACaWQBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQABLAAAAAIFAAAAE09yZGVyRmlsbGVkVG90YWxLZXkFAAAAAmlkAAAAABBPcmRlclNwbGl0U3ltYm9sAgAAAAFfAAAAAAtCb25kQXNzZXRJZAkAAlkAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAA5Cb25kQXNzZXRJZEtleQAAAAAPTmV1dHJpbm9Bc3NldElkCQACWQAAAAEJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQAAAAAQTmV1dHJpbm9Db250cmFjdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAATTmV1dHJpbm9Db250cmFjdEtleQAAAAAHV2F2ZWxldAAAAAAABfXhAAAAAAAIQ0FOQ0VMRUQCAAAACGNhbmNlbGVkAAAAAANORVcCAAAAA25ldwAAAAAGRklMTEVEAgAAAAZmaWxsZWQBAAAAEmNhbGN1bGF0ZU9yZGVyYm9vawAAAAIAAAAHb3JkZXJJZAAAAAhwb3NpdGlvbgQAAAAGb3JkZXJzCQAEtQAAAAIFAAAACW9yZGVyYm9vawUAAAAQT3JkZXJTcGxpdFN5bWJvbAQAAAAIbmV3T3JkZXIJAAEsAAAAAgUAAAAHb3JkZXJJZAUAAAAQT3JkZXJTcGxpdFN5bWJvbAMJAAAAAAAAAgUAAAAIcG9zaXRpb24AAAAAAAAAAAAJAAEsAAAAAgUAAAAIbmV3T3JkZXIFAAAACW9yZGVyYm9vawMJAABnAAAAAgUAAAAIcG9zaXRpb24JAABlAAAAAgkAAZAAAAABBQAAAAZvcmRlcnMAAAAAAAAAAAEJAAEsAAAAAgUAAAAJb3JkZXJib29rBQAAAAhuZXdPcmRlcgQAAAAFcGFydHMJAAS1AAAAAgUAAAAJb3JkZXJib29rCQABLAAAAAIJAAGRAAAAAgUAAAAGb3JkZXJzBQAAAAhwb3NpdGlvbgUAAAAQT3JkZXJTcGxpdFN5bWJvbAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAAZEAAAACBQAAAAVwYXJ0cwAAAAAAAAAAAAUAAAAIbmV3T3JkZXIJAAEsAAAAAgkAAZEAAAACBQAAAAZvcmRlcnMFAAAACHBvc2l0aW9uBQAAABBPcmRlclNwbGl0U3ltYm9sCQABkQAAAAIFAAAABXBhcnRzAAAAAAAAAAABAAAAAwAAAAFpAQAAAAhzZXRPcmRlcgAAAAIAAAAFcHJpY2UAAAAIcG9zaXRpb24EAAAAA3BtdAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAApuZXdPcmRlcklkCQACWAAAAAEJAAH1AAAAAQkAAMsAAAACCQAAywAAAAIJAADLAAAAAgkAAZoAAAABBQAAAAVwcmljZQkAAZoAAAABCAUAAAADcG10AAAABmFtb3VudAgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkAAZoAAAABBQAAAAZoZWlnaHQDCQEAAAACIT0AAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAD05ldXRyaW5vQXNzZXRJZAkAAAIAAAABAgAAABVjYW4gdXNlIG5ldXRyaW5vIG9ubHkDCQAAZwAAAAIAAAAAAAAAAAAFAAAABXByaWNlCQAAAgAAAAECAAAAD3ByaWNlIGxlc3MgemVybwMJAQAAAAIhPQAAAAIJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAKbmV3T3JkZXJJZAUAAAAETk9ORQkAAAIAAAABAgAAAAxvcmRlciBleGlzdHMEAAAABm9yZGVycwkABLUAAAACBQAAAAlvcmRlcmJvb2sFAAAAEE9yZGVyU3BsaXRTeW1ib2wEAAAAC25leHRPcmRlcklkAwkAAAAAAAACBQAAAAhwb3NpdGlvbgAAAAAAAAAAAAIAAAAACQABkQAAAAIFAAAABm9yZGVycwUAAAAIcG9zaXRpb24EAAAADm5leHRPcmRlclByaWNlCQEAAAANZ2V0T3JkZXJQcmljZQAAAAEFAAAAC25leHRPcmRlcklkBAAAABBpc05leHRPcmRlckVycm9yAwMJAQAAAAIhPQAAAAIFAAAAC25leHRPcmRlcklkAgAAAAAJAABmAAAAAgUAAAAFcHJpY2UFAAAADm5leHRPcmRlclByaWNlBwYHBAAAAAtwcmV2T3JkZXJJZAkAAZEAAAACBQAAAAZvcmRlcnMFAAAACHBvc2l0aW9uBAAAAA5wcmV2T3JkZXJQcmljZQkBAAAADWdldE9yZGVyUHJpY2UAAAABBQAAAAtwcmV2T3JkZXJJZAQAAAAQaXNQcmV2T3JkZXJFcnJvcgMJAABnAAAAAgUAAAAOcHJldk9yZGVyUHJpY2UFAAAABXByaWNlBgcDAwUAAAAQaXNOZXh0T3JkZXJFcnJvcgYFAAAAEGlzUHJldk9yZGVyRXJyb3IJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAfaW52YWxpZCBvcmRlciBpc1ByZXZPcmRlckVycm9yOgkAAaUAAAABBQAAABBpc1ByZXZPcmRlckVycm9yAgAAABIgaXNOZXh0T3JkZXJFcnJvcjoJAAGlAAAAAQUAAAAQaXNOZXh0T3JkZXJFcnJvcgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAMT3JkZXJCb29rS2V5CQEAAAASY2FsY3VsYXRlT3JkZXJib29rAAAAAgUAAAAKbmV3T3JkZXJJZAUAAAAIcG9zaXRpb24JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANT3JkZXJQcmljZUtleQUAAAAKbmV3T3JkZXJJZAUAAAAFcHJpY2UJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANT3JkZXJUb3RhbEtleQUAAAAKbmV3T3JkZXJJZAgFAAAAA3BtdAAAAAZhbW91bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAANT3JkZXJPd25lcktleQUAAAAKbmV3T3JkZXJJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAOT3JkZXJIZWlnaHRLZXkFAAAACm5ld09yZGVySWQFAAAABmhlaWdodAUAAAADbmlsAAAAAWkBAAAAC2NhbmNlbE9yZGVyAAAAAQAAAAdvcmRlcklkBAAAAAVvd25lcgkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAAdvcmRlcklkBAAAAAZhbW91bnQJAABlAAAAAgkBAAAADWdldE9yZGVyVG90YWwAAAABBQAAAAdvcmRlcklkCQEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEFAAAAB29yZGVySWQDCQEAAAACIT0AAAACBQAAAAVvd25lcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAACAAAAAQIAAAARcGVybWlzc2lvbiBkZW5pZWQEAAAABXBhcnRzCQAEtQAAAAIFAAAACW9yZGVyYm9vawkAASwAAAACBQAAAAdvcmRlcklkBQAAABBPcmRlclNwbGl0U3ltYm9sCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAMT3JkZXJCb29rS2V5CQABLAAAAAIJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAAJAAGRAAAAAgUAAAAFcGFydHMAAAAAAAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAAEsAAAAAgUAAAAOT3JkZXJTdGF0dXNLZXkFAAAAB29yZGVySWQFAAAACENBTkNFTEVEBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZhbW91bnQFAAAAD05ldXRyaW5vQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAAB2V4ZWN1dGUAAAAABAAAAAdvcmRlcklkCQABkQAAAAIJAAS1AAAAAgUAAAAJb3JkZXJib29rBQAAABBPcmRlclNwbGl0U3ltYm9sAAAAAAAAAAAABAAAAApib25kQW1vdW50CQAD6wAAAAIFAAAABHRoaXMFAAAAC0JvbmRBc3NldElkBAAAAAtmaWxsZWRUb3RhbAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAAdvcmRlcklkBAAAAApvcmRlclRvdGFsCQEAAAANZ2V0T3JkZXJUb3RhbAAAAAEFAAAAB29yZGVySWQEAAAACm9yZGVyUHJpY2UJAQAAAA1nZXRPcmRlclByaWNlAAAAAQUAAAAHb3JkZXJJZAQAAAAGYW1vdW50CQAAaQAAAAIJAABpAAAAAgkAAGgAAAACCQAAZQAAAAIFAAAACm9yZGVyVG90YWwFAAAAC2ZpbGxlZFRvdGFsAAAAAAAAAABkBQAAAApvcmRlclByaWNlBQAAAAdXYXZlbGV0BAAAAAxuZXdPcmRlcmJvb2sDCQAAZwAAAAIFAAAACmJvbmRBbW91bnQFAAAABmFtb3VudAkAAZEAAAACCQAEtQAAAAIFAAAACW9yZGVyYm9vawkAASwAAAACBQAAAAdvcmRlcklkBQAAABBPcmRlclNwbGl0U3ltYm9sAAAAAAAAAAABBQAAAAlvcmRlcmJvb2sEAAAADGZpbGxlZEFtb3VudAMJAABnAAAAAgUAAAAKYm9uZEFtb3VudAUAAAAGYW1vdW50BQAAAAZhbW91bnQFAAAACmJvbmRBbW91bnQEAAAABXRvdGFsCQAAaAAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAxmaWxsZWRBbW91bnQFAAAACm9yZGVyUHJpY2UAAAAAAAAAAGQFAAAAB1dhdmVsZXQEAAAABnN0YXR1cwMJAABnAAAAAgUAAAAKYm9uZEFtb3VudAUAAAAGYW1vdW50BQAAAAZGSUxMRUQFAAAAA05FVwkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADE9yZGVyQm9va0tleQUAAAAMbmV3T3JkZXJib29rCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAAE09yZGVyRmlsbGVkVG90YWxLZXkFAAAAB29yZGVySWQJAABkAAAAAgUAAAALZmlsbGVkVG90YWwFAAAABXRvdGFsCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQABLAAAAAIFAAAADk9yZGVyU3RhdHVzS2V5BQAAAAdvcmRlcklkBQAAAAZzdGF0dXMFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGZpbGxlZEFtb3VudAUAAAALQm9uZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAABBOZXV0cmlub0NvbnRyYWN0BQAAAAV0b3RhbAUAAAAPTmV1dHJpbm9Bc3NldElkBQAAAANuaWwAAAAAfV733g==", "chainId": 84, "height": 668964, "spentComplexity": 0 } View: original | compacted Prev: FVPaHXec7ajAhMnNV7tjE3bu8Wyc79ZRhCTVub361eZt Next: FzHvQUisCtq6LfpaWVircu1Haab6UXUJac4g5SpYEqFN Diff:
OldNewDifferences
2323
2424 let OrderPriceKey = "order_price_"
2525
26-let OrderAmountKey = "order_amount_"
26+let OrderTotalKey = "order_total_"
27+
28+let OrderFilledTotalKey = "order_filled_total_"
2729
2830 let OrderOwnerKey = "order_owner_"
2931
3032 let OrderHeightKey = "order_height_"
3133
34+let OrderStatusKey = "order_status_"
35+
3236 let BondAssetIdKey = "bond_asset_id"
3337
3438 let NeutrinoAssetIdKey = "neutrino_asset_id"
3539
36-let NeutrinoContractKey = "neutrino_contract_address"
40+let NeutrinoContractKey = "neutrino_contract"
3741
38-func getOrderBook () = getStringByKey(OrderBookKey)
39-
42+let orderbook = getStringByKey(OrderBookKey)
4043
4144 func getOrderPrice (id) = getNumberByKey((OrderPriceKey + id))
4245
4346
44-func getOrderAmount (id) = getNumberByKey((OrderAmountKey + id))
47+func getOrderTotal (id) = getNumberByKey((OrderTotalKey + id))
4548
4649
4750 func getOrderOwner (id) = getStringByKey((OrderOwnerKey + id))
51+
52+
53+func getOrderStatus (id) = getStringByKey((OrderStatusKey + id))
54+
55+
56+func getOrderFilledTotal (id) = getNumberByKey((OrderFilledTotalKey + id))
4857
4958
5059 let OrderSplitSymbol = "_"
5766
5867 let Wavelet = 100000000
5968
69+let CANCELED = "canceled"
70+
71+let NEW = "new"
72+
73+let FILLED = "filled"
74+
75+func calculateOrderbook (orderId,position) = {
76+ let orders = split(orderbook, OrderSplitSymbol)
77+ let newOrder = (orderId + OrderSplitSymbol)
78+ if ((position == 0))
79+ then (newOrder + orderbook)
80+ else if ((position >= (size(orders) - 1)))
81+ then (orderbook + newOrder)
82+ else {
83+ let parts = split(orderbook, (orders[position] + OrderSplitSymbol))
84+ (((parts[0] + newOrder) + (orders[position] + OrderSplitSymbol)) + parts[1])
85+ }
86+ }
87+
88+
6089 @Callable(i)
61-func setOrder (price,nextOrderIndex) = {
62- let orderbook = getOrderBook()
90+func setOrder (price,position) = {
6391 let pmt = extract(i.payment)
6492 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
6593 if ((pmt.assetId != NeutrinoAssetId))
6694 then throw("can use neutrino only")
67- else if ((getOrderOwner(newOrderId) != NONE))
68- then throw("order exists")
69- else if ((orderbook == NONE))
70- then WriteSet([DataEntry(OrderBookKey, (OrderSplitSymbol + newOrderId)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
71- else if ((nextOrderIndex == 0))
72- then {
73- let prevOrderId = split(orderbook, OrderSplitSymbol)[1]
74- let prevOrderPrice = getOrderPrice(prevOrderId)
75- if ((price > prevOrderPrice))
76- then WriteSet([DataEntry(OrderBookKey, ((OrderSplitSymbol + newOrderId) + orderbook)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
77- else throw("invalid price prev order")
78- }
79- else {
80- let orders = split(orderbook, OrderSplitSymbol)
81- let nextOrderId = orders[nextOrderIndex]
82- let nextOrderPrice = getOrderPrice(nextOrderId)
83- if ((price > nextOrderPrice))
84- then throw("invalid price next order")
85- else if (((nextOrderIndex + 1) >= size(orders)))
86- then WriteSet([DataEntry(OrderBookKey, ((orderbook + OrderSplitSymbol) + newOrderId)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
87- else {
88- let prevOrderId = orders[(nextOrderIndex + 1)]
89- let prevOrderPrice = getOrderPrice(prevOrderId)
90- if ((price > prevOrderPrice))
91- then {
92- let newOrderBookOnePart = split(orderbook, nextOrderId)[0]
93- let newOrderBookTwoPart = split(orderbook, nextOrderId)[1]
94- WriteSet([DataEntry(OrderBookKey, ((((newOrderBookOnePart + nextOrderId) + OrderSplitSymbol) + newOrderId) + newOrderBookTwoPart)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
95- }
96- else throw("invalid price prev order")
97- }
98- }
95+ else if ((0 >= price))
96+ then throw("price less zero")
97+ else if ((getOrderOwner(newOrderId) != NONE))
98+ then throw("order exists")
99+ else {
100+ let orders = split(orderbook, OrderSplitSymbol)
101+ let nextOrderId = if ((position == 0))
102+ then ""
103+ else orders[position]
104+ let nextOrderPrice = getOrderPrice(nextOrderId)
105+ let isNextOrderError = if (if ((nextOrderId != ""))
106+ then (price > nextOrderPrice)
107+ else false)
108+ then true
109+ else false
110+ let prevOrderId = orders[position]
111+ let prevOrderPrice = getOrderPrice(prevOrderId)
112+ let isPrevOrderError = if ((prevOrderPrice >= price))
113+ then true
114+ else false
115+ if (if (isNextOrderError)
116+ then true
117+ else isPrevOrderError)
118+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
119+ else WriteSet([DataEntry(OrderBookKey, calculateOrderbook(newOrderId, position)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderTotalKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
120+ }
99121 }
100122
101123
102124
103125 @Callable(i)
104126 func cancelOrder (orderId) = {
105- let orderbook = getOrderBook()
106127 let owner = getOrderOwner(orderId)
107- let amount = getOrderAmount(orderId)
128+ let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
108129 if ((owner != toString(i.caller)))
109130 then throw("permission denied")
110131 else {
111- let newOrderBookOnePart = split(orderbook, (OrderSplitSymbol + orderId))[0]
112- let newOrderBookTwoPart = split(orderbook, (OrderSplitSymbol + orderId))[1]
113- ScriptResult(WriteSet([DataEntry(OrderBookKey, (newOrderBookOnePart + newOrderBookTwoPart)), DataEntry((OrderPriceKey + orderId), 0), DataEntry((OrderAmountKey + orderId), 0)]), TransferSet([ScriptTransfer(i.caller, amount, NeutrinoAssetId)]))
132+ let parts = split(orderbook, (orderId + OrderSplitSymbol))
133+ ScriptResult(WriteSet([DataEntry(OrderBookKey, (parts[0] + parts[1])), DataEntry((OrderStatusKey + orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, NeutrinoAssetId)]))
114134 }
115135 }
116136
118138
119139 @Callable(i)
120140 func execute () = {
121- let orderbook = getOrderBook()
122- let orderId = split(orderbook, OrderSplitSymbol)[1]
123- let orderAmount = getOrderAmount(orderId)
141+ let orderId = split(orderbook, OrderSplitSymbol)[0]
142+ let bondAmount = assetBalance(this, BondAssetId)
143+ let filledTotal = getOrderFilledTotal(orderId)
144+ let orderTotal = getOrderTotal(orderId)
124145 let orderPrice = getOrderPrice(orderId)
125- let total = (((orderAmount / orderPrice) * 100) / Wavelet)
126- let newBondAmount = assetBalance(this, BondAssetId)
127- if ((newBondAmount >= total))
128- then {
129- let newOrderBookTwoPart = split(orderbook, (OrderSplitSymbol + orderId))[1]
130- ScriptResult(WriteSet([DataEntry(OrderBookKey, newOrderBookTwoPart), DataEntry((OrderPriceKey + orderId), 0), DataEntry((OrderAmountKey + orderId), 0)]), TransferSet([ScriptTransfer(i.caller, total, BondAssetId), ScriptTransfer(addressFromStringValue(NeutrinoContract), orderAmount, NeutrinoAssetId)]))
131- }
132- else ScriptResult(WriteSet([DataEntry((OrderAmountKey + orderId), (total - newBondAmount))]), TransferSet([ScriptTransfer(i.caller, newBondAmount, BondAssetId), ScriptTransfer(addressFromStringValue(NeutrinoContract), (((newBondAmount / orderPrice) * 100) / Wavelet), NeutrinoAssetId)]))
146+ let amount = ((((orderTotal - filledTotal) * 100) / orderPrice) / Wavelet)
147+ let newOrderbook = if ((bondAmount >= amount))
148+ then split(orderbook, (orderId + OrderSplitSymbol))[1]
149+ else orderbook
150+ let filledAmount = if ((bondAmount >= amount))
151+ then amount
152+ else bondAmount
153+ let total = (((filledAmount * orderPrice) / 100) * Wavelet)
154+ let status = if ((bondAmount >= amount))
155+ then FILLED
156+ else NEW
157+ ScriptResult(WriteSet([DataEntry(OrderBookKey, newOrderbook), DataEntry((OrderFilledTotalKey + orderId), (filledTotal + total)), DataEntry((OrderStatusKey + orderId), status)]), TransferSet([ScriptTransfer(i.caller, filledAmount, BondAssetId), ScriptTransfer(addressFromStringValue(NeutrinoContract), total, NeutrinoAssetId)]))
133158 }
134159
135160
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = ""
55
66 func getNumberByKey (key) = match getInteger(this, key) {
77 case a: Int =>
88 a
99 case _ =>
1010 0
1111 }
1212
1313
1414 func getStringByKey (key) = match getString(this, key) {
1515 case a: String =>
1616 a
1717 case _ =>
1818 NONE
1919 }
2020
2121
2222 let OrderBookKey = "orderbook"
2323
2424 let OrderPriceKey = "order_price_"
2525
26-let OrderAmountKey = "order_amount_"
26+let OrderTotalKey = "order_total_"
27+
28+let OrderFilledTotalKey = "order_filled_total_"
2729
2830 let OrderOwnerKey = "order_owner_"
2931
3032 let OrderHeightKey = "order_height_"
3133
34+let OrderStatusKey = "order_status_"
35+
3236 let BondAssetIdKey = "bond_asset_id"
3337
3438 let NeutrinoAssetIdKey = "neutrino_asset_id"
3539
36-let NeutrinoContractKey = "neutrino_contract_address"
40+let NeutrinoContractKey = "neutrino_contract"
3741
38-func getOrderBook () = getStringByKey(OrderBookKey)
39-
42+let orderbook = getStringByKey(OrderBookKey)
4043
4144 func getOrderPrice (id) = getNumberByKey((OrderPriceKey + id))
4245
4346
44-func getOrderAmount (id) = getNumberByKey((OrderAmountKey + id))
47+func getOrderTotal (id) = getNumberByKey((OrderTotalKey + id))
4548
4649
4750 func getOrderOwner (id) = getStringByKey((OrderOwnerKey + id))
51+
52+
53+func getOrderStatus (id) = getStringByKey((OrderStatusKey + id))
54+
55+
56+func getOrderFilledTotal (id) = getNumberByKey((OrderFilledTotalKey + id))
4857
4958
5059 let OrderSplitSymbol = "_"
5160
5261 let BondAssetId = fromBase58String(getStringByKey(BondAssetIdKey))
5362
5463 let NeutrinoAssetId = fromBase58String(getStringByKey(NeutrinoAssetIdKey))
5564
5665 let NeutrinoContract = getStringByKey(NeutrinoContractKey)
5766
5867 let Wavelet = 100000000
5968
69+let CANCELED = "canceled"
70+
71+let NEW = "new"
72+
73+let FILLED = "filled"
74+
75+func calculateOrderbook (orderId,position) = {
76+ let orders = split(orderbook, OrderSplitSymbol)
77+ let newOrder = (orderId + OrderSplitSymbol)
78+ if ((position == 0))
79+ then (newOrder + orderbook)
80+ else if ((position >= (size(orders) - 1)))
81+ then (orderbook + newOrder)
82+ else {
83+ let parts = split(orderbook, (orders[position] + OrderSplitSymbol))
84+ (((parts[0] + newOrder) + (orders[position] + OrderSplitSymbol)) + parts[1])
85+ }
86+ }
87+
88+
6089 @Callable(i)
61-func setOrder (price,nextOrderIndex) = {
62- let orderbook = getOrderBook()
90+func setOrder (price,position) = {
6391 let pmt = extract(i.payment)
6492 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
6593 if ((pmt.assetId != NeutrinoAssetId))
6694 then throw("can use neutrino only")
67- else if ((getOrderOwner(newOrderId) != NONE))
68- then throw("order exists")
69- else if ((orderbook == NONE))
70- then WriteSet([DataEntry(OrderBookKey, (OrderSplitSymbol + newOrderId)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
71- else if ((nextOrderIndex == 0))
72- then {
73- let prevOrderId = split(orderbook, OrderSplitSymbol)[1]
74- let prevOrderPrice = getOrderPrice(prevOrderId)
75- if ((price > prevOrderPrice))
76- then WriteSet([DataEntry(OrderBookKey, ((OrderSplitSymbol + newOrderId) + orderbook)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
77- else throw("invalid price prev order")
78- }
79- else {
80- let orders = split(orderbook, OrderSplitSymbol)
81- let nextOrderId = orders[nextOrderIndex]
82- let nextOrderPrice = getOrderPrice(nextOrderId)
83- if ((price > nextOrderPrice))
84- then throw("invalid price next order")
85- else if (((nextOrderIndex + 1) >= size(orders)))
86- then WriteSet([DataEntry(OrderBookKey, ((orderbook + OrderSplitSymbol) + newOrderId)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
87- else {
88- let prevOrderId = orders[(nextOrderIndex + 1)]
89- let prevOrderPrice = getOrderPrice(prevOrderId)
90- if ((price > prevOrderPrice))
91- then {
92- let newOrderBookOnePart = split(orderbook, nextOrderId)[0]
93- let newOrderBookTwoPart = split(orderbook, nextOrderId)[1]
94- WriteSet([DataEntry(OrderBookKey, ((((newOrderBookOnePart + nextOrderId) + OrderSplitSymbol) + newOrderId) + newOrderBookTwoPart)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderAmountKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
95- }
96- else throw("invalid price prev order")
97- }
98- }
95+ else if ((0 >= price))
96+ then throw("price less zero")
97+ else if ((getOrderOwner(newOrderId) != NONE))
98+ then throw("order exists")
99+ else {
100+ let orders = split(orderbook, OrderSplitSymbol)
101+ let nextOrderId = if ((position == 0))
102+ then ""
103+ else orders[position]
104+ let nextOrderPrice = getOrderPrice(nextOrderId)
105+ let isNextOrderError = if (if ((nextOrderId != ""))
106+ then (price > nextOrderPrice)
107+ else false)
108+ then true
109+ else false
110+ let prevOrderId = orders[position]
111+ let prevOrderPrice = getOrderPrice(prevOrderId)
112+ let isPrevOrderError = if ((prevOrderPrice >= price))
113+ then true
114+ else false
115+ if (if (isNextOrderError)
116+ then true
117+ else isPrevOrderError)
118+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
119+ else WriteSet([DataEntry(OrderBookKey, calculateOrderbook(newOrderId, position)), DataEntry((OrderPriceKey + newOrderId), price), DataEntry((OrderTotalKey + newOrderId), pmt.amount), DataEntry((OrderOwnerKey + newOrderId), toString(i.caller)), DataEntry((OrderHeightKey + newOrderId), height)])
120+ }
99121 }
100122
101123
102124
103125 @Callable(i)
104126 func cancelOrder (orderId) = {
105- let orderbook = getOrderBook()
106127 let owner = getOrderOwner(orderId)
107- let amount = getOrderAmount(orderId)
128+ let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
108129 if ((owner != toString(i.caller)))
109130 then throw("permission denied")
110131 else {
111- let newOrderBookOnePart = split(orderbook, (OrderSplitSymbol + orderId))[0]
112- let newOrderBookTwoPart = split(orderbook, (OrderSplitSymbol + orderId))[1]
113- ScriptResult(WriteSet([DataEntry(OrderBookKey, (newOrderBookOnePart + newOrderBookTwoPart)), DataEntry((OrderPriceKey + orderId), 0), DataEntry((OrderAmountKey + orderId), 0)]), TransferSet([ScriptTransfer(i.caller, amount, NeutrinoAssetId)]))
132+ let parts = split(orderbook, (orderId + OrderSplitSymbol))
133+ ScriptResult(WriteSet([DataEntry(OrderBookKey, (parts[0] + parts[1])), DataEntry((OrderStatusKey + orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, NeutrinoAssetId)]))
114134 }
115135 }
116136
117137
118138
119139 @Callable(i)
120140 func execute () = {
121- let orderbook = getOrderBook()
122- let orderId = split(orderbook, OrderSplitSymbol)[1]
123- let orderAmount = getOrderAmount(orderId)
141+ let orderId = split(orderbook, OrderSplitSymbol)[0]
142+ let bondAmount = assetBalance(this, BondAssetId)
143+ let filledTotal = getOrderFilledTotal(orderId)
144+ let orderTotal = getOrderTotal(orderId)
124145 let orderPrice = getOrderPrice(orderId)
125- let total = (((orderAmount / orderPrice) * 100) / Wavelet)
126- let newBondAmount = assetBalance(this, BondAssetId)
127- if ((newBondAmount >= total))
128- then {
129- let newOrderBookTwoPart = split(orderbook, (OrderSplitSymbol + orderId))[1]
130- ScriptResult(WriteSet([DataEntry(OrderBookKey, newOrderBookTwoPart), DataEntry((OrderPriceKey + orderId), 0), DataEntry((OrderAmountKey + orderId), 0)]), TransferSet([ScriptTransfer(i.caller, total, BondAssetId), ScriptTransfer(addressFromStringValue(NeutrinoContract), orderAmount, NeutrinoAssetId)]))
131- }
132- else ScriptResult(WriteSet([DataEntry((OrderAmountKey + orderId), (total - newBondAmount))]), TransferSet([ScriptTransfer(i.caller, newBondAmount, BondAssetId), ScriptTransfer(addressFromStringValue(NeutrinoContract), (((newBondAmount / orderPrice) * 100) / Wavelet), NeutrinoAssetId)]))
146+ let amount = ((((orderTotal - filledTotal) * 100) / orderPrice) / Wavelet)
147+ let newOrderbook = if ((bondAmount >= amount))
148+ then split(orderbook, (orderId + OrderSplitSymbol))[1]
149+ else orderbook
150+ let filledAmount = if ((bondAmount >= amount))
151+ then amount
152+ else bondAmount
153+ let total = (((filledAmount * orderPrice) / 100) * Wavelet)
154+ let status = if ((bondAmount >= amount))
155+ then FILLED
156+ else NEW
157+ ScriptResult(WriteSet([DataEntry(OrderBookKey, newOrderbook), DataEntry((OrderFilledTotalKey + orderId), (filledTotal + total)), DataEntry((OrderStatusKey + orderId), status)]), TransferSet([ScriptTransfer(i.caller, filledAmount, BondAssetId), ScriptTransfer(addressFromStringValue(NeutrinoContract), total, NeutrinoAssetId)]))
133158 }
134159
135160

github/deemru/w8io/169f3d6 
43.81 ms