tx · EwdZwXCmVtw2cSFG363nnJLBbQy73X6HDSUy881WMoJ2

3N8nPqPBGYNuxPmDC8QBUAkqd25oHt78Q1W:  -0.01400000 Waves

2019.12.27 14:26 [827379] smart account 3N8nPqPBGYNuxPmDC8QBUAkqd25oHt78Q1W > SELF 0.00000000 Waves

{ "type": 13, "id": "EwdZwXCmVtw2cSFG363nnJLBbQy73X6HDSUy881WMoJ2", "fee": 1400000, "feeAssetId": null, "timestamp": 1577446084114, "version": 1, "sender": "3N8nPqPBGYNuxPmDC8QBUAkqd25oHt78Q1W", "senderPublicKey": "ZyDggzduMRPn6gbuaHWGMJHhQmHbohgDB6xuaeWTsXM", "proofs": [ "2g59GJjSqHiq9AfTw9TmnKMeaH4dcEbX2oifiQEbnDLjzhg8bBC47pp1BRtTn2eJ32dhcDnrCKezCsb2QYEgjGw" ], "script": "base64:AAIDAAAAAAAAAA8IARIECgIBARIDCgEIEgAAAAA3AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAFUEFVTEkAAAAAAAAPQkAAAAAAD1BFUkNFTlRBQ0NVUkFDWQAAAAAAAAAD6AAAAAANTUlOT1JERVJUT1RBTAkAAGgAAAACAAAAAAAAAAAKBQAAAAdXQVZFTEVUAAAAAAtNQVhESVNDT1VOVAAAAAAAAAAAMgAAAAAIQ0FOQ0VMRUQCAAAACGNhbmNlbGVkAAAAAANORVcCAAAAA25ldwAAAAAGRklMTEVEAgAAAAZmaWxsZWQAAAAAE05ldXRyaW5vQ29udHJhY3RLZXkCAAAAEW5ldXRyaW5vX2NvbnRyYWN0AAAAAAxPcmRlcmJvb2tLZXkCAAAACW9yZGVyYm9vawAAAAAIUHJpY2VLZXkCAAAABXByaWNlAAAAAA5Cb25kQXNzZXRJZEtleQIAAAANYm9uZF9hc3NldF9pZAAAAAASTmV1dHJpbm9Bc3NldElkS2V5AgAAABFuZXV0cmlub19hc3NldF9pZAAAAAASQ29udHJvbENvbnRyYWN0S2V5AgAAABBjb250cm9sX2NvbnRyYWN0AAAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAANYmFsYW5jZV9sb2NrXwAAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAV3YXZlcwAAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5CQABLAAAAAIFAAAAEUJhbGFuY2VMb2NrZWRrS2V5AgAAAAhuZXV0cmlubwAAAAAWTGlxdWlkYXRpb25Db250cmFjdEtleQIAAAAUbGlxdWlkYXRpb25fY29udHJhY3QBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfcHJpY2VfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlclRvdGFsS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJPd25lcktleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9vd25lcl8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVySGVpZ2h0S2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX2hlaWdodF8FAAAAB29yZGVySWQBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADW9yZGVyX3N0YXR1c18FAAAAB29yZGVySWQBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAATb3JkZXJfZmlsbGVkX3RvdGFsXwUAAAAHb3JkZXJJZAEAAAASZ2V0T3JkZXJIaXN0b3J5S2V5AAAAAQAAAAZoZWlnaHQJAAEsAAAAAgIAAAAOb3JkZXJfaGlzdG9yeV8JAAGkAAAAAQUAAAAGaGVpZ2h0AQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQAAAAAAAAAAGQFAAAABXByaWNlBQAAAAdXQVZFTEVUBQAAAAVQQVVMSQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAAAAAAZAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEAAAAGYW1vdW50CQAAaQAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEAAAAGYW1vdW50CQAAaAAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAIAAAAGYW1vdW50AAAABXByaWNlCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAZhbW91bnQFAAAABXByaWNlAQAAABZjb252ZXJ0SnNvbkFycmF5VG9MaXN0AAAAAQAAAAlqc29uQXJyYXkJAAS1AAAAAgUAAAAJanNvbkFycmF5AgAAAAEsAAAAAAlvcmRlcmJvb2sJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADE9yZGVyYm9va0tleQAAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAABNOZXV0cmlub0NvbnRyYWN0S2V5AAAAAA9jb250cm9sQ29udHJhY3QJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEkNvbnRyb2xDb250cmFjdEtleQAAAAATbGlxdWlkYXRpb25Db250cmFjdAkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkAAAAADGN1cnJlbnRQcmljZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAUAAAAIUHJpY2VLZXkAAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkBAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQAAAAASd2F2ZXNMb2NrZWRCYWxhbmNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAA9uZXV0cmlub0Fzc2V0SWQJAAJZAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAEk5ldXRyaW5vQXNzZXRJZEtleQAAAAALYm9uZEFzc2V0SWQJAAJZAAAAAQkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADkJvbmRBc3NldElkS2V5AAAAAAdyZXNlcnZlCQAAZQAAAAIJAQAAAAx3YXZlc0JhbGFuY2UAAAABBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAABJ3YXZlc0xvY2tlZEJhbGFuY2UAAAAADm5ldXRyaW5vU3VwcGx5CQAAZQAAAAIJAABkAAAAAgkAAGUAAAACCAkBAAAAB2V4dHJhY3QAAAABCQAD7AAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAhxdWFudGl0eQkAA+sAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQFAAAAFW5ldXRyaW5vTG9ja2VkQmFsYW5jZQkAA+sAAAACCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAE2xpcXVpZGF0aW9uQ29u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ZXJJZAUAAAAIQ0FOQ0VMRUQFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEJAQAAAA1nZXRPcmRlck93bmVyAAAAAQUAAAAHb3JkZXJJZAUAAAAJZnJlZVRvdGFsBQAAAAR1bml0BQAAAANuaWwJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkDCQAAZwAAAAIFAAAACmJvbmRBbW91bnQFAAAABmFtb3VudAkBAAAACWRyb3BPcmRlcgAAAAEFAAAAB29yZGVySWQFAAAACW9yZGVyYm9vawkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAFmdldE9yZGVyRmlsbGVkVG90YWxLZXkAAAABBQAAAAdvcmRlcklkCQAAZAAAAAIFAAAAC2ZpbGxlZFRvdGFsBQAAAAV0b3RhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAHb3JkZXJJZAMJAABnAAAAAgUAAAAKYm9uZEFtb3VudAUAAAAGYW1vdW50BQAAAAZGSUxMRUQFAAAAA05FVwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEmdldE9yZGVySGlzdG9yeUtleQAAAAEFAAAABmhlaWdodAUAAAAKb3JkZXJQcmljZQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQkBAAAADWdldE9yZGVyT3duZXIAAAABBQAAAAdvcmRlcklkBQAAAA5maWxsYWJsZUFtb3VudAUAAAALYm9uZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAFdG90YWwFAAAABHVuaXQFAAAAA25pbAAAAADmFyiL", "chainId": 84, "height": 827379, "spentComplexity": 0 } View: original | compacted Prev: 3CASbjoKQeTEJyQoXgKG948Nd8V7dm4vqWnk55uRWrJi Next: none Diff:
OldNewDifferences
4040 let PERCENTACCURACY = 1000
4141
4242 let MINORDERTOTAL = (10 * WAVELET)
43+
44+let MAXDISCOUNT = 50
4345
4446 let CANCELED = "canceled"
4547
172174 func addBuyBondOrder (price,position) = {
173175 let pmt = extract(i.payment)
174176 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
177+ let neutrnoequivalent = convertWavesToNeutrino(pmt.amount, currentPrice)
178+ let discount = fraction((convertBondToNeutrino(convertWavesToBond(pmt.amount, price)) - neutrnoequivalent), 100, neutrnoequivalent)
175179 if ((MINORDERTOTAL > pmt.amount))
176180 then throw(("min order total equals " + toString(MINORDERTOTAL)))
177- else if (isDefined(pmt.assetId))
178- then throw("can use waves only")
179- else if ((0 >= price))
180- then throw("price less zero")
181- else if ((getOrderOwner(newOrderId) != ""))
182- then throw("order exists")
183- else {
184- let orders = split(orderbook, "_")
185- let nextOrderId = if ((position == 0))
186- then ""
187- else orders[(position - 1)]
188- let nextOrderPrice = getOrderPrice(nextOrderId)
189- let isNextOrderError = if (if ((nextOrderId != ""))
190- then (price > nextOrderPrice)
191- else false)
192- then true
193- else false
194- let prevOrderId = orders[position]
195- let prevOrderPrice = getOrderPrice(prevOrderId)
196- let isPrevOrderError = if ((prevOrderPrice >= price))
197- then true
198- else false
199- if (if (isNextOrderError)
200- then true
201- else isPrevOrderError)
202- then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
203- else WriteSet([DataEntry(OrderbookKey, addOrder(newOrderId, position)), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
204- }
181+ else if ((discount >= MAXDISCOUNT))
182+ then throw("max discount is 50%")
183+ else if (isDefined(pmt.assetId))
184+ then throw("can use waves only")
185+ else if ((0 >= price))
186+ then throw("price less zero")
187+ else if ((getOrderOwner(newOrderId) != ""))
188+ then throw("order exists")
189+ else {
190+ let orders = split(orderbook, "_")
191+ let nextOrderId = if ((position == 0))
192+ then ""
193+ else orders[(position - 1)]
194+ let nextOrderPrice = getOrderPrice(nextOrderId)
195+ let isNextOrderError = if (if ((nextOrderId != ""))
196+ then (price > nextOrderPrice)
197+ else false)
198+ then true
199+ else false
200+ let prevOrderId = orders[position]
201+ let prevOrderPrice = getOrderPrice(prevOrderId)
202+ let isPrevOrderError = if ((prevOrderPrice >= price))
203+ then true
204+ else false
205+ if (if (isNextOrderError)
206+ then true
207+ else isPrevOrderError)
208+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
209+ else WriteSet([DataEntry(OrderbookKey, addOrder(newOrderId, position)), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
210+ }
205211 }
206212
207213
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getNumberByKey (key) = match getInteger(this, key) {
55 case a: Int =>
66 a
77 case _ =>
88 0
99 }
1010
1111
1212 func getStringByKey (key) = match getString(this, key) {
1313 case a: String =>
1414 a
1515 case _ =>
1616 ""
1717 }
1818
1919
2020 func getStringByAddressAndKey (address,key) = match getString(address, key) {
2121 case a: String =>
2222 a
2323 case _ =>
2424 ""
2525 }
2626
2727
2828 func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
2929 case a: Int =>
3030 a
3131 case _ =>
3232 0
3333 }
3434
3535
3636 let WAVELET = 100000000
3737
3838 let PAULI = 1000000
3939
4040 let PERCENTACCURACY = 1000
4141
4242 let MINORDERTOTAL = (10 * WAVELET)
43+
44+let MAXDISCOUNT = 50
4345
4446 let CANCELED = "canceled"
4547
4648 let NEW = "new"
4749
4850 let FILLED = "filled"
4951
5052 let NeutrinoContractKey = "neutrino_contract"
5153
5254 let OrderbookKey = "orderbook"
5355
5456 let PriceKey = "price"
5557
5658 let BondAssetIdKey = "bond_asset_id"
5759
5860 let NeutrinoAssetIdKey = "neutrino_asset_id"
5961
6062 let ControlContractKey = "control_contract"
6163
6264 let BalanceLockedkKey = "balance_lock_"
6365
6466 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
6567
6668 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
6769
6870 let LiquidationContractKey = "liquidation_contract"
6971
7072 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
7173
7274
7375 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
7476
7577
7678 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
7779
7880
7981 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
8082
8183
8284 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
8385
8486
8587 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
8688
8789
8890 func getOrderHistoryKey (height) = ("order_history_" + toString(height))
8991
9092
9193 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
9294
9395
9496 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
9597
9698
9799 func convertNeutrinoToBond (amount) = (amount / PAULI)
98100
99101
100102 func convertBondToNeutrino (amount) = (amount * PAULI)
101103
102104
103105 func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
104106
105107
106108 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
107109
108110
109111 let orderbook = getStringByKey(OrderbookKey)
110112
111113 let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
112114
113115 let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
114116
115117 let liquidationContract = getStringByAddressAndKey(neutrinoContract, LiquidationContractKey)
116118
117119 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
118120
119121 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
120122
121123 let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
122124
123125 let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
124126
125127 let bondAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, BondAssetIdKey))
126128
127129 let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
128130
129131 let neutrinoSupply = (((extract(assetInfo(neutrinoAssetId)).quantity - assetBalance(neutrinoContract, neutrinoAssetId)) + neutrinoLockedBalance) - assetBalance(addressFromStringValue(liquidationContract), neutrinoAssetId))
130132
131133 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
132134
133135 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
134136
135137
136138 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
137139
138140
139141 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
140142
141143
142144 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
143145
144146
145147 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
146148
147149
148150 func getOrderElementById (id) = (id + "_")
149151
150152
151153 func addOrder (orderId,position) = {
152154 let orders = split(orderbook, "_")
153155 let newOrder = getOrderElementById(orderId)
154156 if ((position == 0))
155157 then (newOrder + orderbook)
156158 else if ((position >= (size(orders) - 1)))
157159 then (orderbook + newOrder)
158160 else {
159161 let parts = split(orderbook, getOrderElementById(orders[position]))
160162 (((parts[0] + newOrder) + getOrderElementById(orders[position])) + parts[1])
161163 }
162164 }
163165
164166
165167 func dropOrder (orderId) = {
166168 let parts = split(orderbook, getOrderElementById(orderId))
167169 (parts[0] + parts[1])
168170 }
169171
170172
171173 @Callable(i)
172174 func addBuyBondOrder (price,position) = {
173175 let pmt = extract(i.payment)
174176 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
177+ let neutrnoequivalent = convertWavesToNeutrino(pmt.amount, currentPrice)
178+ let discount = fraction((convertBondToNeutrino(convertWavesToBond(pmt.amount, price)) - neutrnoequivalent), 100, neutrnoequivalent)
175179 if ((MINORDERTOTAL > pmt.amount))
176180 then throw(("min order total equals " + toString(MINORDERTOTAL)))
177- else if (isDefined(pmt.assetId))
178- then throw("can use waves only")
179- else if ((0 >= price))
180- then throw("price less zero")
181- else if ((getOrderOwner(newOrderId) != ""))
182- then throw("order exists")
183- else {
184- let orders = split(orderbook, "_")
185- let nextOrderId = if ((position == 0))
186- then ""
187- else orders[(position - 1)]
188- let nextOrderPrice = getOrderPrice(nextOrderId)
189- let isNextOrderError = if (if ((nextOrderId != ""))
190- then (price > nextOrderPrice)
191- else false)
192- then true
193- else false
194- let prevOrderId = orders[position]
195- let prevOrderPrice = getOrderPrice(prevOrderId)
196- let isPrevOrderError = if ((prevOrderPrice >= price))
197- then true
198- else false
199- if (if (isNextOrderError)
200- then true
201- else isPrevOrderError)
202- then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
203- else WriteSet([DataEntry(OrderbookKey, addOrder(newOrderId, position)), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
204- }
181+ else if ((discount >= MAXDISCOUNT))
182+ then throw("max discount is 50%")
183+ else if (isDefined(pmt.assetId))
184+ then throw("can use waves only")
185+ else if ((0 >= price))
186+ then throw("price less zero")
187+ else if ((getOrderOwner(newOrderId) != ""))
188+ then throw("order exists")
189+ else {
190+ let orders = split(orderbook, "_")
191+ let nextOrderId = if ((position == 0))
192+ then ""
193+ else orders[(position - 1)]
194+ let nextOrderPrice = getOrderPrice(nextOrderId)
195+ let isNextOrderError = if (if ((nextOrderId != ""))
196+ then (price > nextOrderPrice)
197+ else false)
198+ then true
199+ else false
200+ let prevOrderId = orders[position]
201+ let prevOrderPrice = getOrderPrice(prevOrderId)
202+ let isPrevOrderError = if ((prevOrderPrice >= price))
203+ then true
204+ else false
205+ if (if (isNextOrderError)
206+ then true
207+ else isPrevOrderError)
208+ then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
209+ else WriteSet([DataEntry(OrderbookKey, addOrder(newOrderId, position)), DataEntry(getOrderPriceKey(newOrderId), price), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), toString(i.caller)), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
210+ }
205211 }
206212
207213
208214
209215 @Callable(i)
210216 func cancelOrder (orderId) = {
211217 let owner = getOrderOwner(orderId)
212218 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
213219 if ((owner != toString(i.caller)))
214220 then throw("permission denied")
215221 else if ((getOrderStatus(orderId) != NEW))
216222 then throw("invalid order status")
217223 else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, unit)]))
218224 }
219225
220226
221227
222228 @Callable(i)
223229 func sellBond () = {
224230 let bondBalance = assetBalance(this, bondAssetId)
225231 let deficitPositive = if ((0 >= deficit))
226232 then 0
227233 else deficit
228234 let bondAmount = if ((deficitPositive >= bondBalance))
229235 then bondBalance
230236 else deficitPositive
231237 let returnAmount = if ((deficitPositive >= bondBalance))
232238 then 0
233239 else (bondBalance - deficitPositive)
234240 if (if ((returnAmount == 0))
235241 then (bondAmount == 0)
236242 else false)
237243 then throw("without deficit")
238244 else if ((bondAmount == 0))
239245 then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, bondAssetId)])
240246 else if ((orderbook == ""))
241247 then throw("empty orderbook")
242248 else {
243249 let orderId = split(orderbook, "_")[0]
244250 let filledTotal = getOrderFilledTotal(orderId)
245251 let orderPrice = getOrderPrice(orderId)
246252 let freeTotal = (getOrderTotal(orderId) - filledTotal)
247253 let amount = convertWavesToBond(freeTotal, orderPrice)
248254 let fillableAmount = if ((bondAmount >= amount))
249255 then amount
250256 else bondAmount
251257 let total = fraction((fillableAmount * orderPrice), PAULI, 100)
252258 if (if ((total == 0))
253259 then true
254260 else (amount == 0))
255261 then ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), freeTotal, unit)]))
256262 else ScriptResult(WriteSet([DataEntry(OrderbookKey, if ((bondAmount >= amount))
257263 then dropOrder(orderId)
258264 else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + total)), DataEntry(getOrderStatusKey(orderId), if ((bondAmount >= amount))
259265 then FILLED
260266 else NEW), DataEntry(getOrderHistoryKey(height), orderPrice)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), fillableAmount, bondAssetId), ScriptTransfer(neutrinoContract, total, unit)]))
261267 }
262268 }
263269
264270

github/deemru/w8io/3ef1775 
57.97 ms