tx · 6YtxyEczAUq2uXjvqChgGZSSWPg95wddMDmqSKg9pP2P

3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7:  -0.14000000 Waves

2020.04.16 12:37 [2020094] smart account 3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7 > SELF 0.00000000 Waves

{ "type": 13, "id": "6YtxyEczAUq2uXjvqChgGZSSWPg95wddMDmqSKg9pP2P", "fee": 14000000, "feeAssetId": null, "timestamp": 1587028910260, "version": 1, "sender": "3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7", "senderPublicKey": "H8Gooqgk4486MkqEQVwACpgoyEjt5Px4eskysnEDZ1nR", "proofs": [ "2Kda9V9mzyud8y9rpThUJ5xa6TwdTWBKPESVzZ3JCeZXGiJw97GTyZ5GdoZ2AbKS2s3M9mNrdTDrGaZoRb5xSGgy", "2g6FgFVBy7zVKpaxw34FtZLmqMFU1FkiWEEBEtjhdQHezronvd2mv9FvyjtFyoCiuzA3BrATTJFLH7StWHyB8SBA", "2PKEEe6Ybr3Sy6bKm2ctNknwmRbw3PzCM8g2dAibKFZCRTzFEN7G4YeaatbNz2r7UiTF8jfGCTySBj6VVK74PuXA" ], "script": "base64:AAIDAAAAAAAAAAQIARIAAAAAKAEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAABZnZXRCb29sQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBsAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEHAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NBbmRLZXkAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAGGdldE51bWJlckJ5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAABVBBVUxJAAAAAAAAD0JAAAAAAAtNQVhESVNDT1VOVAAAAAAAAAAAMgAAAAAIQ0FOQ0VMRUQCAAAACGNhbmNlbGVkAAAAAANORVcCAAAAA25ldwAAAAAGRklMTEVEAgAAAAZmaWxsZWQAAAAAE05ldXRyaW5vQ29udHJhY3RLZXkCAAAAEW5ldXRyaW5vX2NvbnRyYWN0AAAAAAhQcmljZUtleQIAAAAFcHJpY2UAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8AAAAADUZpcnN0T3JkZXJLZXkCAAAAC29yZGVyX2ZpcnN0AAAAAAxMYXN0T3JkZXJLZXkCAAAACm9yZGVyX2xhc3QBAAAAEGdldE9yZGVyUHJpY2VLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfcHJpY2VfBQAAAAdvcmRlcklkAQAAAA9nZXRPcmRlck5leHRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAALb3JkZXJfbmV4dF8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfdG90YWxfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX293bmVyXwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfc3RhdHVzXwUAAAAHb3JkZXJJZAEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABNvcmRlcl9maWxsZWRfdG90YWxfBQAAAAdvcmRlcklkAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAECAAAAIzNQQzlCZlJ3SldXaXc5QVJFRTJCM2VXekNrczNDWXRnNHlvAAAAAA9jb250cm9sQ29udHJhY3QJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQIAAAAjM1A1QmZkNThQUGZOdkJNMkh5OFFmYmNEcU1lTnR6ZzdLZlAAAAAAE2xpcXVpZGF0aW9uQ29udHJhY3QJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQIAAAAjM1A0UEN4c0pxTXpRQkFMbzh6QU5IdEJEWlJScXVvYkhRcDcAAAAAD25ldXRyaW5vQXNzZXRJZAkAAlkAAAABAgAAACxERzJ4RmtQZER3S1VvQmt6R0FoUXRMcFNHemZYTGlDWVBFemVLSDJBZDI0cAAAAAALYm9uZEFzc2V0SWQJAAJZAAAAAQIAAAAsNm5TcFZ5Tkg3eU02OWVnNDQ2d3JRUjk0aXBiYmNtWk1VMUVOUHdhbkM5N2cAAAAACWlzQmxvY2tlZAkBAAAAFmdldEJvb2xCeUFkZHJlc3NBbmRLZXkAAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAACmlzX2Jsb2NrZWQAAAAACmZpcnN0T3JkZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAADUZpcnN0T3JkZXJLZXkAAAAACWxhc3RPcmRlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAMTGFzdE9yZGVyS2V5AQAAAAxnZXRPcmRlck5leHQAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAPZ2V0T3JkZXJOZXh0S2V5AAAAAQUAAAACaWQBAAAADWdldE9yZGVyVG90YWwAAAABAAAAAmlkCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0T3JkZXJUb3RhbEtleQAAAAEFAAAAAmlkAQAAAA1nZXRPcmRlck93bmVyAAAAAQAAAAJpZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGdldE9yZGVyT3duZXJLZXkAAAABBQAAAAJpZAEAAAAOZ2V0T3JkZXJTdGF0dXMAAAABAAAAAmlkCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABBQAAAAJpZAEAAAATZ2V0T3JkZXJGaWxsZWRUb3RhbAAAAAEAAAACaWQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZnZXRPcmRlckZpbGxlZFRvdGFsS2V5AAAAAQUAAAACaWQAAAAAFkN1cnJlbnREZWZhdWx0T3JkZXJLZXkCAAAADW9yZGVyX2RlZmF1bHQAAAABAAAAAWkBAAAAGG1pZ3JhdGlvbk9yZGVyc05TQlR0b1NPTgAAAAAEAAAAFGtleUxhc3RNaWdyYXRlZE9yZGVyAgAAACFsYXN0TWlncmF0ZWRPcmRlcklkX21pZ3JhdGlvbl9TT04EAAAAC2ZpbmFsU3RhdHVzAgAAAA9taWdyYXRlZF90b19TT04EAAAAGmlzTGFzdE1pZ3JhdGVkQXNGaXJzdE9yZGVyCQAAAAAAAAIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFGtleUxhc3RNaWdyYXRlZE9yZGVyAgAAAAAEAAAAE2xhc3RNaWdyYXRlZE9yZGVySWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEFAAAAFGtleUxhc3RNaWdyYXRlZE9yZGVyBAAAAA5jdXJyZW50T3JkZXJJZAMFAAAAGmlzTGFzdE1pZ3JhdGVkQXNGaXJzdE9yZGVyBQAAAApmaXJzdE9yZGVyCQEAAAAMZ2V0T3JkZXJOZXh0AAAAAQUAAAATbGFzdE1pZ3JhdGVkT3JkZXJJZAQAAAAda2V5U3RhdHVzTGlxdWlkYXRpb25NaWdyYXRpb24JAAEsAAAAAgIAAAAVc3RhdHVzX21pZ3JhdGlvbl9TT05fBQAAAA5jdXJyZW50T3JkZXJJZAQAAAALb3JkZXJBbW91bnQJAABlAAAAAgkBAAAADWdldE9yZGVyVG90YWwAAAABBQAAAA5jdXJyZW50T3JkZXJJZAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAA5jdXJyZW50T3JkZXJJZAQAAAAKb3JkZXJPd25lcgkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAADmN1cnJlbnRPcmRlcklkBAAAAAtvcmRlclN0YXR1cwkBAAAADmdldE9yZGVyU3RhdHVzAAAAAQUAAAAOY3VycmVudE9yZGVySWQEAAAAD21pZ3JhdGlvblN0YXR1cwkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQUAAAAda2V5U3RhdHVzTGlxdWlkYXRpb25NaWdyYXRpb24DCQAAAAAAAAIFAAAAD21pZ3JhdGlvblN0YXR1cwUAAAALZmluYWxTdGF0dXMJAAACAAAAAQIAAAAhZXJyb3I6IG9yZGVyIGhhcyBhbHJlYWR5IG1pZ3JhdGVkAwkAAAAAAAACBQAAAAlsYXN0T3JkZXIFAAAAE2xhc3RNaWdyYXRlZE9yZGVySWQJAAACAAAAAQIAAAA/c3RhdHVzIG9rOiBhbGwgb3JkZXIgaGFzIGFscmVhZHkgbWlncmF0ZWQgb3Igbm90aGluZyB0byBtaWdyYXRlAwkBAAAAAiE9AAAAAgUAAAALb3JkZXJTdGF0dXMFAAAAA05FVwkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAda2V5U3RhdHVzTGlxdWlkYXRpb25NaWdyYXRpb24FAAAAC2ZpbmFsU3RhdHVzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABRrZXlMYXN0TWlncmF0ZWRPcmRlcgUAAAAOY3VycmVudE9yZGVySWQFAAAAA25pbAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAda2V5U3RhdHVzTGlxdWlkYXRpb25NaWdyYXRpb24FAAAAC2ZpbmFsU3RhdHVzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABRrZXlMYXN0TWlncmF0ZWRPcmRlcgUAAAAOY3VycmVudE9yZGVySWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABBnZXRPcmRlclByaWNlS2V5AAAAAQUAAAAOY3VycmVudE9yZGVySWQAAAAAAAAAAGQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAFkN1cnJlbnREZWZhdWx0T3JkZXJLZXkFAAAADmN1cnJlbnRPcmRlcklkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABBwdWJLZXlBZG1pbnNMaXN0CQAETAAAAAICAAAALEJMRW9ndXpQVktWVGZYeHhUM1c3UnFmOGFVbTJnZ0M5VmVtZDJNUWF3TTJHCQAETAAAAAICAAAALEZXVmZmWXIyQUxtSE1lalptM1dxZUx6NlNkeW0zZ0xGR3RKbjRLVHd5VTV4CQAETAAAAAICAAAALDNXaDJMYVdjYjVnZzdLMnBQY1czRXA2RUF1UkJ6WWtBZ3JkcHQ0M2pUREZhCQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwEAAAABWNvdW50CQAAZAAAAAIJAABkAAAAAgkAAGQAAAACAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAMJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAADAAAAAAAAAAACAAAAAAAAAAAACQAAZwAAAAIFAAAABWNvdW50AAAAAAAAAAADXea7/Q==", "chainId": 87, "height": 2020094, "spentComplexity": 0 } View: original | compacted Prev: G8yPFpyA1f7QqAf5oboUBQHuaUUYJrQmTbLKsLudwBPr Next: EMBeBj7ypXVNJ71y758DQNiETKeJ9PqJYK8HnakVYQeh Diff:
OldNewDifferences
4343
4444 let WAVELET = 100000000
4545
46-let ORDERSPLITSYMBOL = "_"
47-
4846 let PAULI = 1000000
49-
50-let PERCENTACCURACY = 1000
5147
5248 let MAXDISCOUNT = 50
5349
6056 let NeutrinoContractKey = "neutrino_contract"
6157
6258 let PriceKey = "price"
63-
64-let BondAssetIdKey = "bond_asset_id"
6559
6660 let NeutrinoAssetIdKey = "neutrino_asset_id"
6761
7771
7872 let LastOrderKey = "order_last"
7973
80-func getOrderPrevKey (orderId) = ("order_prev_" + orderId)
74+func getOrderPriceKey (orderId) = ("order_price_" + orderId)
8175
8276
8377 func getOrderNextKey (orderId) = ("order_next_" + orderId)
8983 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
9084
9185
92-func getOrderHeightKey (orderId) = ("order_height_" + orderId)
93-
94-
9586 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
9687
9788
9889 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
9990
10091
101-func getLastOrderOwnerKey (owner) = ("last_order_owner_" + owner)
92+let neutrinoContract = addressFromStringValue("3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo")
10293
94+let controlContract = addressFromStringValue("3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP")
10395
104-func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
96+let liquidationContract = addressFromStringValue("3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7")
10597
106-
107-func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
108-
109-
110-func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
111-
112-
113-let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
114-
115-let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
116-
117-let liquidationContract = this
118-
119-let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
98+let neutrinoAssetId = fromBase58String("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p")
12099
121100 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
101+
102+let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
122103
123104 let firstOrder = getStringByKey(FirstOrderKey)
124105
125106 let lastOrder = getStringByKey(LastOrderKey)
126107
127-let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
108+func getOrderNext (id) = getStringByKey(getOrderNextKey(id))
128109
129-let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
130-
131-let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
132-
133-let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
134-
135-let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
136-
137-let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
138-
139-let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
140110
141111 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
142112
150120 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
151121
152122
153-func getOrderPrev (id) = getStringByKey(getOrderPrevKey(id))
154-
155-
156-func getOrderNext (id) = getStringByKey(getOrderNextKey(id))
157-
158-
159-func getOrderHeight (id) = getNumberByKey(getOrderHeightKey(id))
160-
161-
162-func getLastOrderOwner (owner) = getStringByKey(getLastOrderOwnerKey(owner))
163-
123+let CurrentDefaultOrderKey = "order_default"
164124
165125 @Callable(i)
166-func addLiquidationOrder () = {
167- let pmt = extract(i.payment)
168- let newOrderId = toBase58String(keccak256((((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
169- let nextOrder = getOrderNext(lastOrder)
170- let orderStatus = getOrderStatus(lastOrder)
171- let owner = toString(i.caller)
172- if (isBlocked)
173- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
174- else if ((pmt.assetId != bondAssetId))
175- then throw("can use appropriate neutrino bonds tokens only")
176- else if ((getOrderOwner(newOrderId) != ""))
177- then throw("an order is already exists")
178- else if ((nextOrder != ""))
179- then throw(("nextOrder is not last. Info:" + nextOrder))
180- else if (if ((firstOrder != ""))
181- then (lastOrder == "")
182- else false)
183- then throw("invalid last order")
184- else if (if ((firstOrder != ""))
185- then (orderStatus != NEW)
186- else false)
187- then throw("last order status is not new")
188- else if ((PAULI > pmt.amount))
189- then throw("order amount must be higher than 1 NSBT")
190- else WriteSet([DataEntry(getLastOrderOwnerKey(owner), newOrderId), DataEntry(getOrderPrevKey(newOrderId), lastOrder), DataEntry(getOrderNextKey(lastOrder), if ((lastOrder == ""))
191- then ""
192- else newOrderId), DataEntry(FirstOrderKey, if ((firstOrder == ""))
193- then newOrderId
194- else firstOrder), DataEntry(LastOrderKey, newOrderId), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), owner), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
195- }
196-
197-
198-
199-@Callable(i)
200-func cancelOrder (orderId) = {
201- let owner = getOrderOwner(orderId)
202- let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
203- let nextOrder = getOrderNext(orderId)
204- let prevOrder = getOrderPrev(orderId)
205- if (isBlocked)
206- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
207- else if ((owner != toString(i.caller)))
208- then throw("permission denied")
209- else if ((getOrderStatus(orderId) != NEW))
210- then throw("invalid order status")
211- else ScriptResult(WriteSet([DataEntry(FirstOrderKey, if ((firstOrder == orderId))
212- then nextOrder
213- else firstOrder), DataEntry(LastOrderKey, if ((lastOrder == orderId))
214- then prevOrder
215- else lastOrder), DataEntry(getOrderNextKey(prevOrder), nextOrder), DataEntry(getOrderPrevKey(nextOrder), prevOrder), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
216- }
217-
218-
219-
220-@Callable(i)
221-func liquidateBond () = {
222- let surplusPositive = if ((0 >= surplus))
223- then 0
224- else surplus
225- let liquidationBalance = assetBalance(this, neutrinoAssetId)
226- let returnAmount = if ((surplusPositive >= liquidationBalance))
227- then 0
228- else (liquidationBalance - surplusPositive)
229- let surplusBond = surplusPositive
230- if (isBlocked)
231- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
232- else if (if ((returnAmount == 0))
233- then (liquidationBalance == 0)
234- else false)
235- then throw("cannot liquidate order without neutrino on the smart contract")
236- else if ((returnAmount > 0))
237- then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)])
238- else if ((0 >= surplusBond))
239- then throw("there is no proficit on the smart contract now")
240- else if ((firstOrder == ""))
241- then throw("empty orderbook")
242- else {
243- let nextOrder = getOrderNext(firstOrder)
244- let orderTotal = getOrderTotal(firstOrder)
245- let orderOwner = getOrderOwner(firstOrder)
246- let filledTotal = getOrderFilledTotal(firstOrder)
247- let amount = (orderTotal - filledTotal)
248- let newStatus = if ((surplusBond >= amount))
249- then FILLED
250- else NEW
251- let fillableOrderAmount = if ((surplusBond >= amount))
252- then amount
253- else surplusBond
254- ScriptResult(WriteSet([DataEntry(getOrderPrevKey(nextOrder), if ((newStatus == FILLED))
255- then ""
256- else firstOrder), DataEntry(FirstOrderKey, if ((newStatus == FILLED))
257- then nextOrder
258- else firstOrder), DataEntry(LastOrderKey, if (if ((newStatus == FILLED))
259- then (firstOrder == lastOrder)
260- else false)
261- then ""
262- else lastOrder), DataEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + fillableOrderAmount)), DataEntry(getOrderStatusKey(firstOrder), newStatus)]), TransferSet([ScriptTransfer(addressFromStringValue(orderOwner), fillableOrderAmount, neutrinoAssetId)]))
263- }
126+func migrationOrdersNSBTtoSON () = {
127+ let keyLastMigratedOrder = "lastMigratedOrderId_migration_SON"
128+ let finalStatus = "migrated_to_SON"
129+ let isLastMigratedAsFirstOrder = (getStringByKey(keyLastMigratedOrder) == "")
130+ let lastMigratedOrderId = getStringByKey(keyLastMigratedOrder)
131+ let currentOrderId = if (isLastMigratedAsFirstOrder)
132+ then firstOrder
133+ else getOrderNext(lastMigratedOrderId)
134+ let keyStatusLiquidationMigration = ("status_migration_SON_" + currentOrderId)
135+ let orderAmount = (getOrderTotal(currentOrderId) - getOrderFilledTotal(currentOrderId))
136+ let orderOwner = addressFromStringValue(getOrderOwner(currentOrderId))
137+ let orderStatus = getOrderStatus(currentOrderId)
138+ let migrationStatus = getStringByKey(keyStatusLiquidationMigration)
139+ if ((migrationStatus == finalStatus))
140+ then throw("error: order has already migrated")
141+ else if ((lastOrder == lastMigratedOrderId))
142+ then throw("status ok: all order has already migrated or nothing to migrate")
143+ else if ((orderStatus != NEW))
144+ then WriteSet([DataEntry(keyStatusLiquidationMigration, finalStatus), DataEntry(keyLastMigratedOrder, currentOrderId)])
145+ else WriteSet([DataEntry(keyStatusLiquidationMigration, finalStatus), DataEntry(keyLastMigratedOrder, currentOrderId), DataEntry(getOrderPriceKey(currentOrderId), 100), DataEntry(CurrentDefaultOrderKey, currentOrderId)])
264146 }
265147
266148
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 getBoolByAddressAndKey (address,key) = match getBoolean(address, key) {
2121 case a: Boolean =>
2222 a
2323 case _ =>
2424 false
2525 }
2626
2727
2828 func getStringByAddressAndKey (address,key) = match getString(address, key) {
2929 case a: String =>
3030 a
3131 case _ =>
3232 ""
3333 }
3434
3535
3636 func getNumberByAddressAndKey (address,key) = match getInteger(address, key) {
3737 case a: Int =>
3838 a
3939 case _ =>
4040 0
4141 }
4242
4343
4444 let WAVELET = 100000000
4545
46-let ORDERSPLITSYMBOL = "_"
47-
4846 let PAULI = 1000000
49-
50-let PERCENTACCURACY = 1000
5147
5248 let MAXDISCOUNT = 50
5349
5450 let CANCELED = "canceled"
5551
5652 let NEW = "new"
5753
5854 let FILLED = "filled"
5955
6056 let NeutrinoContractKey = "neutrino_contract"
6157
6258 let PriceKey = "price"
63-
64-let BondAssetIdKey = "bond_asset_id"
6559
6660 let NeutrinoAssetIdKey = "neutrino_asset_id"
6761
6862 let ControlContractKey = "control_contract"
6963
7064 let BalanceLockedkKey = "balance_lock_"
7165
7266 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
7367
7468 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
7569
7670 let FirstOrderKey = "order_first"
7771
7872 let LastOrderKey = "order_last"
7973
80-func getOrderPrevKey (orderId) = ("order_prev_" + orderId)
74+func getOrderPriceKey (orderId) = ("order_price_" + orderId)
8175
8276
8377 func getOrderNextKey (orderId) = ("order_next_" + orderId)
8478
8579
8680 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
8781
8882
8983 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
9084
9185
92-func getOrderHeightKey (orderId) = ("order_height_" + orderId)
93-
94-
9586 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
9687
9788
9889 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
9990
10091
101-func getLastOrderOwnerKey (owner) = ("last_order_owner_" + owner)
92+let neutrinoContract = addressFromStringValue("3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo")
10293
94+let controlContract = addressFromStringValue("3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP")
10395
104-func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
96+let liquidationContract = addressFromStringValue("3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7")
10597
106-
107-func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
108-
109-
110-func convertWavesToBond (amount,price) = convertWavesToNeutrino(amount, price)
111-
112-
113-let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
114-
115-let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
116-
117-let liquidationContract = this
118-
119-let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
98+let neutrinoAssetId = fromBase58String("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p")
12099
121100 let bondAssetId = fromBase58String("6nSpVyNH7yM69eg446wrQR94ipbbcmZMU1ENPwanC97g")
101+
102+let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
122103
123104 let firstOrder = getStringByKey(FirstOrderKey)
124105
125106 let lastOrder = getStringByKey(LastOrderKey)
126107
127-let isBlocked = getBoolByAddressAndKey(controlContract, "is_blocked")
108+func getOrderNext (id) = getStringByKey(getOrderNextKey(id))
128109
129-let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
130-
131-let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
132-
133-let wavesLockedBalance = getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey)
134-
135-let reserve = (wavesBalance(neutrinoContract) - wavesLockedBalance)
136-
137-let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
138-
139-let surplus = (convertWavesToNeutrino(reserve, currentPrice) - neutrinoSupply)
140110
141111 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
142112
143113
144114 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
145115
146116
147117 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
148118
149119
150120 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
151121
152122
153-func getOrderPrev (id) = getStringByKey(getOrderPrevKey(id))
154-
155-
156-func getOrderNext (id) = getStringByKey(getOrderNextKey(id))
157-
158-
159-func getOrderHeight (id) = getNumberByKey(getOrderHeightKey(id))
160-
161-
162-func getLastOrderOwner (owner) = getStringByKey(getLastOrderOwnerKey(owner))
163-
123+let CurrentDefaultOrderKey = "order_default"
164124
165125 @Callable(i)
166-func addLiquidationOrder () = {
167- let pmt = extract(i.payment)
168- let newOrderId = toBase58String(keccak256((((toBytes(pmt.amount) + i.caller.bytes) + toBytes(height)) + i.transactionId)))
169- let nextOrder = getOrderNext(lastOrder)
170- let orderStatus = getOrderStatus(lastOrder)
171- let owner = toString(i.caller)
172- if (isBlocked)
173- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
174- else if ((pmt.assetId != bondAssetId))
175- then throw("can use appropriate neutrino bonds tokens only")
176- else if ((getOrderOwner(newOrderId) != ""))
177- then throw("an order is already exists")
178- else if ((nextOrder != ""))
179- then throw(("nextOrder is not last. Info:" + nextOrder))
180- else if (if ((firstOrder != ""))
181- then (lastOrder == "")
182- else false)
183- then throw("invalid last order")
184- else if (if ((firstOrder != ""))
185- then (orderStatus != NEW)
186- else false)
187- then throw("last order status is not new")
188- else if ((PAULI > pmt.amount))
189- then throw("order amount must be higher than 1 NSBT")
190- else WriteSet([DataEntry(getLastOrderOwnerKey(owner), newOrderId), DataEntry(getOrderPrevKey(newOrderId), lastOrder), DataEntry(getOrderNextKey(lastOrder), if ((lastOrder == ""))
191- then ""
192- else newOrderId), DataEntry(FirstOrderKey, if ((firstOrder == ""))
193- then newOrderId
194- else firstOrder), DataEntry(LastOrderKey, newOrderId), DataEntry(getOrderTotalKey(newOrderId), pmt.amount), DataEntry(getOrderOwnerKey(newOrderId), owner), DataEntry(getOrderHeightKey(newOrderId), height), DataEntry(getOrderStatusKey(newOrderId), NEW)])
195- }
196-
197-
198-
199-@Callable(i)
200-func cancelOrder (orderId) = {
201- let owner = getOrderOwner(orderId)
202- let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
203- let nextOrder = getOrderNext(orderId)
204- let prevOrder = getOrderPrev(orderId)
205- if (isBlocked)
206- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
207- else if ((owner != toString(i.caller)))
208- then throw("permission denied")
209- else if ((getOrderStatus(orderId) != NEW))
210- then throw("invalid order status")
211- else ScriptResult(WriteSet([DataEntry(FirstOrderKey, if ((firstOrder == orderId))
212- then nextOrder
213- else firstOrder), DataEntry(LastOrderKey, if ((lastOrder == orderId))
214- then prevOrder
215- else lastOrder), DataEntry(getOrderNextKey(prevOrder), nextOrder), DataEntry(getOrderPrevKey(nextOrder), prevOrder), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, bondAssetId)]))
216- }
217-
218-
219-
220-@Callable(i)
221-func liquidateBond () = {
222- let surplusPositive = if ((0 >= surplus))
223- then 0
224- else surplus
225- let liquidationBalance = assetBalance(this, neutrinoAssetId)
226- let returnAmount = if ((surplusPositive >= liquidationBalance))
227- then 0
228- else (liquidationBalance - surplusPositive)
229- let surplusBond = surplusPositive
230- if (isBlocked)
231- then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
232- else if (if ((returnAmount == 0))
233- then (liquidationBalance == 0)
234- else false)
235- then throw("cannot liquidate order without neutrino on the smart contract")
236- else if ((returnAmount > 0))
237- then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, neutrinoAssetId)])
238- else if ((0 >= surplusBond))
239- then throw("there is no proficit on the smart contract now")
240- else if ((firstOrder == ""))
241- then throw("empty orderbook")
242- else {
243- let nextOrder = getOrderNext(firstOrder)
244- let orderTotal = getOrderTotal(firstOrder)
245- let orderOwner = getOrderOwner(firstOrder)
246- let filledTotal = getOrderFilledTotal(firstOrder)
247- let amount = (orderTotal - filledTotal)
248- let newStatus = if ((surplusBond >= amount))
249- then FILLED
250- else NEW
251- let fillableOrderAmount = if ((surplusBond >= amount))
252- then amount
253- else surplusBond
254- ScriptResult(WriteSet([DataEntry(getOrderPrevKey(nextOrder), if ((newStatus == FILLED))
255- then ""
256- else firstOrder), DataEntry(FirstOrderKey, if ((newStatus == FILLED))
257- then nextOrder
258- else firstOrder), DataEntry(LastOrderKey, if (if ((newStatus == FILLED))
259- then (firstOrder == lastOrder)
260- else false)
261- then ""
262- else lastOrder), DataEntry(getOrderFilledTotalKey(firstOrder), (filledTotal + fillableOrderAmount)), DataEntry(getOrderStatusKey(firstOrder), newStatus)]), TransferSet([ScriptTransfer(addressFromStringValue(orderOwner), fillableOrderAmount, neutrinoAssetId)]))
263- }
126+func migrationOrdersNSBTtoSON () = {
127+ let keyLastMigratedOrder = "lastMigratedOrderId_migration_SON"
128+ let finalStatus = "migrated_to_SON"
129+ let isLastMigratedAsFirstOrder = (getStringByKey(keyLastMigratedOrder) == "")
130+ let lastMigratedOrderId = getStringByKey(keyLastMigratedOrder)
131+ let currentOrderId = if (isLastMigratedAsFirstOrder)
132+ then firstOrder
133+ else getOrderNext(lastMigratedOrderId)
134+ let keyStatusLiquidationMigration = ("status_migration_SON_" + currentOrderId)
135+ let orderAmount = (getOrderTotal(currentOrderId) - getOrderFilledTotal(currentOrderId))
136+ let orderOwner = addressFromStringValue(getOrderOwner(currentOrderId))
137+ let orderStatus = getOrderStatus(currentOrderId)
138+ let migrationStatus = getStringByKey(keyStatusLiquidationMigration)
139+ if ((migrationStatus == finalStatus))
140+ then throw("error: order has already migrated")
141+ else if ((lastOrder == lastMigratedOrderId))
142+ then throw("status ok: all order has already migrated or nothing to migrate")
143+ else if ((orderStatus != NEW))
144+ then WriteSet([DataEntry(keyStatusLiquidationMigration, finalStatus), DataEntry(keyLastMigratedOrder, currentOrderId)])
145+ else WriteSet([DataEntry(keyStatusLiquidationMigration, finalStatus), DataEntry(keyLastMigratedOrder, currentOrderId), DataEntry(getOrderPriceKey(currentOrderId), 100), DataEntry(CurrentDefaultOrderKey, currentOrderId)])
264146 }
265147
266148
267149 @Verifier(tx)
268150 func verify () = {
269151 let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
270152 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
271153 then 1
272154 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
273155 then 1
274156 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
275157 then 1
276158 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
277159 then 2
278160 else 0))
279161 (count >= 3)
280162 }
281163

github/deemru/w8io/3ef1775 
90.03 ms