tx · DnPiPG9z7TFWE4cpWaWuETvpkzzcK86467gctC97WJNf

3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP:  -0.01400000 Waves

2020.02.11 20:25 [1925523] smart account 3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP > SELF 0.00000000 Waves

{ "type": 13, "id": "DnPiPG9z7TFWE4cpWaWuETvpkzzcK86467gctC97WJNf", "fee": 1400000, "feeAssetId": null, "timestamp": 1581441379730, "version": 1, "sender": "3PG2vMhK5CPqsCDodvLGzQ84QkoHXCJ3oNP", "senderPublicKey": "5RM3w4ysmDbtgfswnVNPx7DQkNwVAG3RoxNFHgt6ToNU", "proofs": [ "4LRrgQkZaHVedghPN6c9kS1nredu2VRZHrjahsbKZK9Pxt9tHHUWgRciNSjYwDk8xPfg7wEkvXT1fJbmtrify4Gw", "3RFehJkyEmjdyDtqXYGGdMfJnUXQUNHFnH6ywvALiWU2XgTSfJjsxm7HTTuQCUcn45vYGgq9zsf8cERoPTTKrTyZ", "3XTadyFMYP94WuGZgiX2uHpFZAHYrVaaicUpRrHFpuXGqbuFxzpg1iEcaRpB3VeuWgkEA59ewKc28b4MqD5cxUqR" ], "script": "base64:AAIDAAAAAAAAAA8IARIECgIBARIDCgEIEgAAAAA2AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAAGGdldFN0cmluZ0J5QWRkcmVzc0FuZEtleQAAAAIAAAAHYWRkcmVzcwAAAANrZXkEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWECAAAAAAEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAAAAAAHV0FWRUxFVAAAAAAABfXhAAAAAAAFUEFVTEkAAAAAAAAPQkAAAAAAD1BFUkNFTlRBQ0NVUkFDWQAAAAAAAAAD6AAAAAANTUlOT1JERVJUT1RBTAkAAGgAAAACAAAAAAAAAAAKBQAAAAdXQVZFTEVUAAAAAAZNQVhST0kAAAAAAAAAAGQAAAAACENBTkNFTEVEAgAAAAhjYW5jZWxlZAAAAAADTkVXAgAAAANuZXcAAAAABkZJTExFRAIAAAAGZmlsbGVkAAAAABNOZXV0cmlub0NvbnRyYWN0S2V5AgAAABFuZXV0cmlub19jb250cmFjdAAAAAAMT3JkZXJib29rS2V5AgAAAAlvcmRlcmJvb2sAAAAACFByaWNlS2V5AgAAAAVwcmljZQAAAAAOQm9uZEFzc2V0SWRLZXkCAAAADWJvbmRfYXNzZXRfaWQAAAAAEk5ldXRyaW5vQXNzZXRJZEtleQIAAAARbmV1dHJpbm9fYXNzZXRfaWQAAAAAEkNvbnRyb2xDb250cmFjdEtleQIAAAAQY29udHJvbF9jb250cmFjdAAAAAARQmFsYW5jZUxvY2tlZGtLZXkCAAAADWJhbGFuY2VfbG9ja18AAAAAFVdhdmVzTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAFd2F2ZXMAAAAAGE5ldXRyaW5vTG9ja2VkQmFsYW5jZUtleQkAASwAAAACBQAAABFCYWxhbmNlTG9ja2Vka0tleQIAAAAIbmV1dHJpbm8AAAAAFkxpcXVpZGF0aW9uQ29udHJhY3RLZXkCAAAAFGxpcXVpZGF0aW9uX2NvbnRyYWN0AQAAABJnZXRSb2lCeU9yZGVySWRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAQZGVidWdfb3JkZXJfcm9pXwUAAAAHb3JkZXJJZAEAAAAQZ2V0T3JkZXJQcmljZUtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAAAxvcmRlcl9wcmljZV8FAAAAB29yZGVySWQBAAAAEGdldE9yZGVyVG90YWxLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAAMb3JkZXJfdG90YWxfBQAAAAdvcmRlcklkAQAAABBnZXRPcmRlck93bmVyS2V5AAAAAQAAAAdvcmRlcklkCQABLAAAAAICAAAADG9yZGVyX293bmVyXwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJIZWlnaHRLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfaGVpZ2h0XwUAAAAHb3JkZXJJZAEAAAARZ2V0T3JkZXJTdGF0dXNLZXkAAAABAAAAB29yZGVySWQJAAEsAAAAAgIAAAANb3JkZXJfc3RhdHVzXwUAAAAHb3JkZXJJZAEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEAAAAHb3JkZXJJZAkAASwAAAACAgAAABNvcmRlcl9maWxsZWRfdG90YWxfBQAAAAdvcmRlcklkAQAAABZjb252ZXJ0TmV1dHJpbm9Ub1dhdmVzAAAAAgAAAAZhbW91bnQAAAAFcHJpY2UJAABrAAAAAwkAAGsAAAADBQAAAAZhbW91bnQAAAAAAAAAAGQFAAAABXByaWNlBQAAAAdXQVZFTEVUBQAAAAVQQVVMSQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIAAAAGYW1vdW50AAAABXByaWNlCQAAawAAAAMJAABrAAAAAwUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAAAAAAZAUAAAAFUEFVTEkFAAAAB1dBVkVMRVQBAAAAFWNvbnZlcnROZXV0cmlub1RvQm9uZAAAAAEAAAAGYW1vdW50CQAAaQAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAFWNvbnZlcnRCb25kVG9OZXV0cmlubwAAAAEAAAAGYW1vdW50CQAAaAAAAAIFAAAABmFtb3VudAUAAAAFUEFVTEkBAAAAEmNvbnZlcnRXYXZlc1RvQm9uZAAAAAIAAAAGYW1vdW50AAAABXByaWNlCQEAAAAVY29udmVydE5ldXRyaW5vVG9Cb25kAAAAAQkBAAAAFmNvbnZlcnRXYXZlc1RvTmV1dHJpbm8AAAACBQAAAAZhbW91bnQFAAAABXByaWNlAQAAABJjb252ZXJ0Qm9uZFRvV2F2ZXMAAAACAAAABmFtb3VudAAAAAVwcmljZQkBAAAAFmNvbnZlcnROZXV0cmlub1RvV2F2ZXMAAAACCQEAAAAVY29udmVydEJvbmRUb05ldXRyaW5vAAAAAQUAAAAGYW1vdW50BQAAAAVwcmljZQAAAAAJb3JkZXJib29rCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABBQAAAAxPcmRlcmJvb2tLZXkAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQIAAAAjM1BDOUJmUndKV1dpdzlBUkVFMkIzZVd6Q2tzM0NZdGc0eW8AAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABAgAAACMzUDVCZmQ1OFBQZk52Qk0ySHk4UWZiY0RxTWVOdHpnN0tmUAAAAAATbGlxdWlkYXRpb25Db250cmFjdAkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABAgAAACMzUDRQQ3hzSnFNelFCQUxvOHpBTkh0QkRaUlJxdW9iSFFwNwAAAAAPbmV1dHJpbm9Bc3NldElkCQACWQAAAAECAAAALERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwAAAAAAtib25kQXNzZXRJZAkAAlkAAAABAgAAACw5NzVha1pCZm5NajUxM1U3TVphSEt6UXJtc0V4NWFFM3dkV0tUckhCaGJqRgAAAAAMY3VycmVudFByaWNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAPY29udHJvbENvbnRyYWN0BQAAAAhQcmljZUtleQAAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAYTmV1dHJpbm9Mb2NrZWRCYWxhbmNlS2V5AAAAAAdyZXNlcnZlCQAAZQAAAAIJAQAAAAx3YXZlc0JhbGFuY2UAAAABBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAYZ2V0TnVtYmVyQnlBZGRyZXNzQW5kS2V5AAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAUAAAAVV2F2ZXNMb2NrZWRCYWxhbmNlS2V5AAAAAA5uZXV0cmlub1N1cHBseQkAAGUAAAACCQAAZQAAAAIJAABkAAAAAgUAAAAVbmV1dHJpbm9Mb2NrZWRCYWxhbmNlCAkBAAAAB2V4dHJhY3QAAAABCQAD7AAAAAEFAAAAD25ldXRyaW5vQXNzZXRJZAAAAAhxdWFudGl0eQkAA+sAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0BQAAAA9uZXV0cmlub0Fzc2V0SWQJAAPrAAAAAgUAAAATbGlxdWlkYXRpb25Db250cmFjdAUAAAAPbmV1dHJpbm9Bc3NldElkAAAAAAdkZWZpY2l0CQAAZQAAAAIFAAAADm5ldXRyaW5vU3VwcGx5CQEAAAAWY29udmVydFdhdmVzVG9OZXV0cmlubwAAAAIFAAAAB3Jlc2VydmUFAAAADGN1cnJlbnRQcmljZQEAAAANZ2V0T3JkZXJQ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Ym9uZHMgdG8gc2VsbAMJAABmAAAAAgUAAAAMcmV0dXJuQW1vdW50AAAAAAAAAAAACQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAADHJldHVybkFtb3VudAUAAAALYm9uZEFzc2V0SWQFAAAAA25pbAMJAAAAAAAAAgUAAAAJb3JkZXJib29rAgAAAAAJAAACAAAAAQIAAAAPZW1wdHkgb3JkZXJib29rBAAAAAdvcmRlcklkCQABLwAAAAIFAAAACW9yZGVyYm9vawkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEswAAAAIFAAAACW9yZGVyYm9vawIAAAABXwIAAAAPbm8gb3JkZXJzIGZvdW5kBAAAAAtmaWxsZWRUb3RhbAkBAAAAE2dldE9yZGVyRmlsbGVkVG90YWwAAAABBQAAAAdvcmRlcklkBAAAAApvcmRlclByaWNlCQEAAAANZ2V0T3JkZXJQcmljZQAAAAEFAAAAB29yZGVySWQEAAAAFXByaWNlV2F2ZXNCeUJvbmRDZW50cwkAAGsAAAADAAAAAAAAAABkAAAAAAAAAABkBQAAAApvcmRlclByaWNlBAAAAANyb2kJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABJnZXRSb2lCeU9yZGVySWRLZXkAAAABBQAAAAdvcmRlcklkBAAAAA1yZW1haW5lZFRvdGFsCQAAZQAAAAIJAQAAAA1nZXRPcmRlclRvdGFsAAAAAQUAAAAHb3JkZXJJZAUAAAALZmlsbGVkVG90YWwEAAAAFGFtb3VudFRvRXhlY3V0ZU9yZGVyCQEAAAASY29udmVydFdhdmVzVG9Cb25kAAAAAgUAAAANcmVtYWluZWRUb3RhbAUAAAAVcHJpY2VXYXZlc0J5Qm9uZENlbnRzBAAAABJmaWxsT3JkZXJDb25kaXRpb24JAABnAAAAAgUAAAAKYm9uZEFtb3VudAUAAAAUYW1vdW50VG9FeGVjdXRlT3JkZXIEAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQDBQAAABJmaWxsT3JkZXJDb25kaXRpb24FAAAAFGFtb3VudFRvRXhlY3V0ZU9yZGVyBQAAAApib25kQW1vdW50BAAAABt0b3RhbE9yZGVyV2F2ZWxldGVzUmVxdWlyZWQJAQAAABJjb252ZXJ0Qm9uZFRvV2F2ZXMAAAACBQAAABNmaWxsYWJsZU9yZGVyQW1vdW50BQAAABVwcmljZVdhdmVzQnlCb25kQ2VudHMDAwkAAGYAAAACBQAAAANyb2kJAABrAAAAAwUAAAAHZGVmaWNpdAAAAAAAAAAAZAUAAAAObmV1dHJpbm9TdXBwbHkGCQAAZwAAAAIAAAAAAAAAAAAFAAAAD2RlZmljaXRQb3NpdGl2ZQkAAAIAAAABCQABLAAAAAICAAAALWRlZmljaXQgc2hvdWxkIGJlIGhpZ3RoZXIgb3IgZXF1YWwgdGhhbiByb2k6IAkAAaQAAAABBQAAAANyb2kDCQAAAAAAAAIFAAAAFGFtb3VudFRvRXhlY3V0ZU9yZGVyAAAAAAAAAAAACQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAMT3JkZXJib29rS2V5CQEAAAAJZHJvcE9yZGVyAAAAAQUAAAAHb3JkZXJJZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAHb3JkZXJJZAUAAAAGRklMTEVEBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQFAAAADXJlbWFpbmVkVG90YWwFAAAABHVuaXQFAAAAA25pbAMJAAAAAAAAAgUAAAAbdG90YWxPcmRlcldhdmVsZXRlc1JlcXVpcmVkAAAAAAAAAAAACQAAAgAAAAECAAAAH2Nhbm5vdCBmaWxsIG9yZGVyIGF0IHRoZSBtb21lbnQJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAxPcmRlcmJvb2tLZXkDAwUAAAASZmlsbE9yZGVyQ29uZGl0aW9uCQAAAAAAAAIFAAAADXJlbWFpbmVkVG90YWwAAAAAAAAAAAAHCQEAAAAJZHJvcE9yZGVyAAAAAQUAAAAHb3JkZXJJZAUAAAAJb3JkZXJib29rCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAWZ2V0T3JkZXJGaWxsZWRUb3RhbEtleQAAAAEFAAAAB29yZGVySWQJAABkAAAAAgUAAAALZmlsbGVkVG90YWwFAAAAG3RvdGFsT3JkZXJXYXZlbGV0ZXNSZXF1aXJlZAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEWdldE9yZGVyU3RhdHVzS2V5AAAAAQUAAAAHb3JkZXJJZAMDBQAAABJmaWxsT3JkZXJDb25kaXRpb24JAAAAAAAAAgUAAAANcmVtYWluZWRUb3RhbAAAAAAAAAAAAAcFAAAABkZJTExFRAUAAAADTkVXBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABCQEAAAANZ2V0T3JkZXJPd25lcgAAAAEFAAAAB29yZGVySWQFAAAAE2ZpbGxhYmxlT3JkZXJBbW91bnQFAAAAC2JvbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAEG5ldXRyaW5vQ29udHJhY3QFAAAAG3RvdGFsT3JkZXJXYXZlbGV0ZXNSZXF1aXJlZAUAAAAEdW5pdAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAQcHViS2V5QWRtaW5zTGlzdAkABEwAAAACAgAAACxCTEVvZ3V6UFZLVlRmWHh4VDNXN1JxZjhhVW0yZ2dDOVZlbWQyTVFhd00yRwkABEwAAAACAgAAACxGV1ZmZllyMkFMbUhNZWpabTNXcWVMejZTZHltM2dMRkd0Sm40S1R3eVU1eAkABEwAAAACAgAAACwzV2gyTGFXY2I1Z2c3SzJwUGNXM0VwNkVBdVJCellrQWdyZHB0NDNqVERGYQkABEwAAAACAgAAACw1V1JYRlNqd2NUYk5mS2NKczhacVhtU1NXWXNTVkpVdE12TXFaajVoSDROYwUAAAADbmlsBAAAAAVjb3VudAkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAABCQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAQAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAACCQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAgAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAADCQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAwAAAAAAAAAAAgAAAAAAAAAAAAkAAGcAAAACBQAAAAVjb3VudAAAAAAAAAAAA5LVvTc=", "chainId": 87, "height": 1925523, "spentComplexity": 0 } View: original | compacted Prev: GbLBRm5RjMFcAGKrPFca1JKHoCocFxoNPvwRn1T2Z5mb Next: BXpPBhHPwXKhrStn9eiJq7c9EyMGZpbuSVcEHBGXRZMT Diff:
OldNewDifferences
6969
7070 let LiquidationContractKey = "liquidation_contract"
7171
72+func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
73+
74+
7275 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
7376
7477
107110
108111 let orderbook = getStringByKey(OrderbookKey)
109112
110-let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
113+let neutrinoContract = addressFromStringValue("3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo")
111114
112-let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
115+let controlContract = addressFromStringValue("3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP")
113116
114-let liquidationContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, LiquidationContractKey))
117+let liquidationContract = addressFromStringValue("3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7")
115118
116-let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
119+let neutrinoAssetId = fromBase58String("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p")
117120
118-let bondAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, BondAssetIdKey))
121+let bondAssetId = fromBase58String("975akZBfnMj513U7MZaHKzQrmsEx5aE3wdWKTrHBhbjF")
119122
120123 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
121124
201204 then true
202205 else isPrevOrderError)
203206 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
204- 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), DataEntry(("debug_order_currentPrice_" + newOrderId), currentPrice), DataEntry(("debug_order_roi_" + newOrderId), roi)])
207+ 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), DataEntry(("debug_order_currentPrice_" + newOrderId), currentPrice), DataEntry(getRoiByOrderIdKey(newOrderId), roi)])
205208 }
206209 }
207210
247250 let filledTotal = getOrderFilledTotal(orderId)
248251 let orderPrice = getOrderPrice(orderId)
249252 let priceWavesByBondCents = fraction(100, 100, orderPrice)
253+ let roi = getNumberByKey(getRoiByOrderIdKey(orderId))
250254 let remainedTotal = (getOrderTotal(orderId) - filledTotal)
251255 let amountToExecuteOrder = convertWavesToBond(remainedTotal, priceWavesByBondCents)
252256 let fillOrderCondition = (bondAmount >= amountToExecuteOrder)
254258 then amountToExecuteOrder
255259 else bondAmount
256260 let totalOrderWaveletesRequired = convertBondToWaves(fillableOrderAmount, priceWavesByBondCents)
257- if ((amountToExecuteOrder == 0))
258- then ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), remainedTotal, unit)]))
259- else if ((totalOrderWaveletesRequired == 0))
260- then throw("cannot fill order at the moment")
261- else ScriptResult(WriteSet([DataEntry(OrderbookKey, if (if (fillOrderCondition)
262- then (remainedTotal == 0)
263- else false)
264- then dropOrder(orderId)
265- else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + totalOrderWaveletesRequired)), DataEntry(getOrderStatusKey(orderId), if (if (fillOrderCondition)
266- then (remainedTotal == 0)
267- else false)
268- then FILLED
269- else NEW)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), fillableOrderAmount, bondAssetId), ScriptTransfer(neutrinoContract, totalOrderWaveletesRequired, unit)]))
261+ if (if ((roi > fraction(deficit, 100, neutrinoSupply)))
262+ then true
263+ else (0 >= deficitPositive))
264+ then throw(("deficit should be higther or equal than roi: " + toString(roi)))
265+ else if ((amountToExecuteOrder == 0))
266+ then ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), remainedTotal, unit)]))
267+ else if ((totalOrderWaveletesRequired == 0))
268+ then throw("cannot fill order at the moment")
269+ else ScriptResult(WriteSet([DataEntry(OrderbookKey, if (if (fillOrderCondition)
270+ then (remainedTotal == 0)
271+ else false)
272+ then dropOrder(orderId)
273+ else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + totalOrderWaveletesRequired)), DataEntry(getOrderStatusKey(orderId), if (if (fillOrderCondition)
274+ then (remainedTotal == 0)
275+ else false)
276+ then FILLED
277+ else NEW)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), fillableOrderAmount, bondAssetId), ScriptTransfer(neutrinoContract, totalOrderWaveletesRequired, unit)]))
270278 }
271279 }
272280
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)
4343
4444 let MAXROI = 100
4545
4646 let CANCELED = "canceled"
4747
4848 let NEW = "new"
4949
5050 let FILLED = "filled"
5151
5252 let NeutrinoContractKey = "neutrino_contract"
5353
5454 let OrderbookKey = "orderbook"
5555
5656 let PriceKey = "price"
5757
5858 let BondAssetIdKey = "bond_asset_id"
5959
6060 let NeutrinoAssetIdKey = "neutrino_asset_id"
6161
6262 let ControlContractKey = "control_contract"
6363
6464 let BalanceLockedkKey = "balance_lock_"
6565
6666 let WavesLockedBalanceKey = (BalanceLockedkKey + "waves")
6767
6868 let NeutrinoLockedBalanceKey = (BalanceLockedkKey + "neutrino")
6969
7070 let LiquidationContractKey = "liquidation_contract"
7171
72+func getRoiByOrderIdKey (orderId) = ("debug_order_roi_" + orderId)
73+
74+
7275 func getOrderPriceKey (orderId) = ("order_price_" + orderId)
7376
7477
7578 func getOrderTotalKey (orderId) = ("order_total_" + orderId)
7679
7780
7881 func getOrderOwnerKey (orderId) = ("order_owner_" + orderId)
7982
8083
8184 func getOrderHeightKey (orderId) = ("order_height_" + orderId)
8285
8386
8487 func getOrderStatusKey (orderId) = ("order_status_" + orderId)
8588
8689
8790 func getOrderFilledTotalKey (orderId) = ("order_filled_total_" + orderId)
8891
8992
9093 func convertNeutrinoToWaves (amount,price) = fraction(fraction(amount, 100, price), WAVELET, PAULI)
9194
9295
9396 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), PAULI, WAVELET)
9497
9598
9699 func convertNeutrinoToBond (amount) = (amount / PAULI)
97100
98101
99102 func convertBondToNeutrino (amount) = (amount * PAULI)
100103
101104
102105 func convertWavesToBond (amount,price) = convertNeutrinoToBond(convertWavesToNeutrino(amount, price))
103106
104107
105108 func convertBondToWaves (amount,price) = convertNeutrinoToWaves(convertBondToNeutrino(amount), price)
106109
107110
108111 let orderbook = getStringByKey(OrderbookKey)
109112
110-let neutrinoContract = addressFromStringValue(getStringByKey(NeutrinoContractKey))
113+let neutrinoContract = addressFromStringValue("3PC9BfRwJWWiw9AREE2B3eWzCks3CYtg4yo")
111114
112-let controlContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, ControlContractKey))
115+let controlContract = addressFromStringValue("3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP")
113116
114-let liquidationContract = addressFromStringValue(getStringByAddressAndKey(neutrinoContract, LiquidationContractKey))
117+let liquidationContract = addressFromStringValue("3P4PCxsJqMzQBALo8zANHtBDZRRquobHQp7")
115118
116-let neutrinoAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, NeutrinoAssetIdKey))
119+let neutrinoAssetId = fromBase58String("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p")
117120
118-let bondAssetId = fromBase58String(getStringByAddressAndKey(neutrinoContract, BondAssetIdKey))
121+let bondAssetId = fromBase58String("975akZBfnMj513U7MZaHKzQrmsEx5aE3wdWKTrHBhbjF")
119122
120123 let currentPrice = getNumberByAddressAndKey(controlContract, PriceKey)
121124
122125 let neutrinoLockedBalance = getNumberByAddressAndKey(neutrinoContract, NeutrinoLockedBalanceKey)
123126
124127 let reserve = (wavesBalance(neutrinoContract) - getNumberByAddressAndKey(neutrinoContract, WavesLockedBalanceKey))
125128
126129 let neutrinoSupply = (((neutrinoLockedBalance + extract(assetInfo(neutrinoAssetId)).quantity) - assetBalance(neutrinoContract, neutrinoAssetId)) - assetBalance(liquidationContract, neutrinoAssetId))
127130
128131 let deficit = (neutrinoSupply - convertWavesToNeutrino(reserve, currentPrice))
129132
130133 func getOrderPrice (id) = getNumberByKey(getOrderPriceKey(id))
131134
132135
133136 func getOrderTotal (id) = getNumberByKey(getOrderTotalKey(id))
134137
135138
136139 func getOrderOwner (id) = getStringByKey(getOrderOwnerKey(id))
137140
138141
139142 func getOrderStatus (id) = getStringByKey(getOrderStatusKey(id))
140143
141144
142145 func getOrderFilledTotal (id) = getNumberByKey(getOrderFilledTotalKey(id))
143146
144147
145148 func getOrderElementById (id) = (id + "_")
146149
147150
148151 func addOrder (orderId,position) = {
149152 let orders = split(orderbook, "_")
150153 let newOrder = getOrderElementById(orderId)
151154 if ((position == 0))
152155 then (newOrder + orderbook)
153156 else if ((position >= (size(orders) - 1)))
154157 then (orderbook + newOrder)
155158 else {
156159 let parts = split(orderbook, getOrderElementById(orders[position]))
157160 (((parts[0] + newOrder) + getOrderElementById(orders[position])) + parts[1])
158161 }
159162 }
160163
161164
162165 func dropOrder (orderId) = {
163166 let parts = split(orderbook, getOrderElementById(orderId))
164167 (parts[0] + parts[1])
165168 }
166169
167170
168171 @Callable(i)
169172 func addBuyBondOrder (price,position) = {
170173 let pmt = extract(i.payment)
171174 let newOrderId = toBase58String(keccak256((((toBytes(price) + toBytes(pmt.amount)) + i.caller.bytes) + toBytes(height))))
172175 let priceWavesByBondCents = fraction(100, 100, price)
173176 let roi = fraction((priceWavesByBondCents - currentPrice), 100, currentPrice)
174177 if ((MINORDERTOTAL > pmt.amount))
175178 then throw(("min order total equals " + toString(MINORDERTOTAL)))
176179 else if ((roi > MAXROI))
177180 then throw("max setOrder ROI is 100%")
178181 else if (isDefined(pmt.assetId))
179182 then throw("can use waves only")
180183 else if ((0 >= price))
181184 then throw("price less zero")
182185 else if ((getOrderOwner(newOrderId) != ""))
183186 then throw("order exists")
184187 else {
185188 let orders = split(orderbook, "_")
186189 let nextOrderId = if ((position == 0))
187190 then ""
188191 else orders[(position - 1)]
189192 let nextOrderPrice = getOrderPrice(nextOrderId)
190193 let isNextOrderError = if (if ((nextOrderId != ""))
191194 then (price > nextOrderPrice)
192195 else false)
193196 then true
194197 else false
195198 let prevOrderId = orders[position]
196199 let prevOrderPrice = getOrderPrice(prevOrderId)
197200 let isPrevOrderError = if ((prevOrderPrice >= price))
198201 then true
199202 else false
200203 if (if (isNextOrderError)
201204 then true
202205 else isPrevOrderError)
203206 then throw(((("invalid order isPrevOrderError:" + toString(isPrevOrderError)) + " isNextOrderError:") + toString(isNextOrderError)))
204- 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), DataEntry(("debug_order_currentPrice_" + newOrderId), currentPrice), DataEntry(("debug_order_roi_" + newOrderId), roi)])
207+ 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), DataEntry(("debug_order_currentPrice_" + newOrderId), currentPrice), DataEntry(getRoiByOrderIdKey(newOrderId), roi)])
205208 }
206209 }
207210
208211
209212
210213 @Callable(i)
211214 func cancelOrder (orderId) = {
212215 let owner = getOrderOwner(orderId)
213216 let amount = (getOrderTotal(orderId) - getOrderFilledTotal(orderId))
214217 if ((owner != toString(i.caller)))
215218 then throw("permission denied")
216219 else if ((getOrderStatus(orderId) != NEW))
217220 then throw("invalid order status")
218221 else ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), CANCELED)]), TransferSet([ScriptTransfer(i.caller, amount, unit)]))
219222 }
220223
221224
222225
223226 @Callable(i)
224227 func sellBond () = {
225228 let bondBalance = assetBalance(this, bondAssetId)
226229 let deficitPositive = if ((0 >= deficit))
227230 then 0
228231 else (deficit / PAULI)
229232 let bondAmount = if ((deficitPositive >= bondBalance))
230233 then bondBalance
231234 else deficitPositive
232235 let returnAmount = if ((deficitPositive >= bondBalance))
233236 then 0
234237 else (bondBalance - deficitPositive)
235238 if (if ((deficitPositive == 0))
236239 then (bondBalance == 0)
237240 else false)
238241 then throw("without deficit")
239242 else if ((bondBalance == 0))
240243 then throw("without bonds to sell")
241244 else if ((returnAmount > 0))
242245 then TransferSet([ScriptTransfer(neutrinoContract, returnAmount, bondAssetId)])
243246 else if ((orderbook == ""))
244247 then throw("empty orderbook")
245248 else {
246249 let orderId = take(orderbook, valueOrErrorMessage(indexOf(orderbook, "_"), "no orders found"))
247250 let filledTotal = getOrderFilledTotal(orderId)
248251 let orderPrice = getOrderPrice(orderId)
249252 let priceWavesByBondCents = fraction(100, 100, orderPrice)
253+ let roi = getNumberByKey(getRoiByOrderIdKey(orderId))
250254 let remainedTotal = (getOrderTotal(orderId) - filledTotal)
251255 let amountToExecuteOrder = convertWavesToBond(remainedTotal, priceWavesByBondCents)
252256 let fillOrderCondition = (bondAmount >= amountToExecuteOrder)
253257 let fillableOrderAmount = if (fillOrderCondition)
254258 then amountToExecuteOrder
255259 else bondAmount
256260 let totalOrderWaveletesRequired = convertBondToWaves(fillableOrderAmount, priceWavesByBondCents)
257- if ((amountToExecuteOrder == 0))
258- then ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), remainedTotal, unit)]))
259- else if ((totalOrderWaveletesRequired == 0))
260- then throw("cannot fill order at the moment")
261- else ScriptResult(WriteSet([DataEntry(OrderbookKey, if (if (fillOrderCondition)
262- then (remainedTotal == 0)
263- else false)
264- then dropOrder(orderId)
265- else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + totalOrderWaveletesRequired)), DataEntry(getOrderStatusKey(orderId), if (if (fillOrderCondition)
266- then (remainedTotal == 0)
267- else false)
268- then FILLED
269- else NEW)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), fillableOrderAmount, bondAssetId), ScriptTransfer(neutrinoContract, totalOrderWaveletesRequired, unit)]))
261+ if (if ((roi > fraction(deficit, 100, neutrinoSupply)))
262+ then true
263+ else (0 >= deficitPositive))
264+ then throw(("deficit should be higther or equal than roi: " + toString(roi)))
265+ else if ((amountToExecuteOrder == 0))
266+ then ScriptResult(WriteSet([DataEntry(OrderbookKey, dropOrder(orderId)), DataEntry(getOrderStatusKey(orderId), FILLED)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), remainedTotal, unit)]))
267+ else if ((totalOrderWaveletesRequired == 0))
268+ then throw("cannot fill order at the moment")
269+ else ScriptResult(WriteSet([DataEntry(OrderbookKey, if (if (fillOrderCondition)
270+ then (remainedTotal == 0)
271+ else false)
272+ then dropOrder(orderId)
273+ else orderbook), DataEntry(getOrderFilledTotalKey(orderId), (filledTotal + totalOrderWaveletesRequired)), DataEntry(getOrderStatusKey(orderId), if (if (fillOrderCondition)
274+ then (remainedTotal == 0)
275+ else false)
276+ then FILLED
277+ else NEW)]), TransferSet([ScriptTransfer(addressFromStringValue(getOrderOwner(orderId)), fillableOrderAmount, bondAssetId), ScriptTransfer(neutrinoContract, totalOrderWaveletesRequired, unit)]))
270278 }
271279 }
272280
273281
274282 @Verifier(tx)
275283 func verify () = {
276284 let pubKeyAdminsList = ["BLEoguzPVKVTfXxxT3W7Rqf8aUm2ggC9Vemd2MQawM2G", "FWVffYr2ALmHMejZm3WqeLz6Sdym3gLFGtJn4KTwyU5x", "3Wh2LaWcb5gg7K2pPcW3Ep6EAuRBzYkAgrdpt43jTDFa", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
277285 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
278286 then 1
279287 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
280288 then 1
281289 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
282290 then 1
283291 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
284292 then 2
285293 else 0))
286294 (count >= 3)
287295 }
288296

github/deemru/w8io/6500d08 
86.60 ms