tx · GB2KBeGj6qPWdAcNqJTPrvQzBpsrpwPaKx63RxfaQpjc

3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT:  -0.01000000 Waves

2023.05.28 12:13 [3663154] smart account 3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT > SELF 0.00000000 Waves

{ "type": 13, "id": "GB2KBeGj6qPWdAcNqJTPrvQzBpsrpwPaKx63RxfaQpjc", "fee": 1000000, "feeAssetId": null, "timestamp": 1685265221254, "version": 2, "chainId": 87, "sender": "3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT", "senderPublicKey": "7kuQGHmvhzQW3ERxGyMrxfq3LuxHSJ6UdBZcuy498sf6", "proofs": [ "3Jp29H1giz3uqV1JXgWRGy5Vs8cX9B5pSDhJ8pPEfFvznsVxC6hAEfHKKfcKGr8zXFjrwuDHkjXCxFvUYoUruMxo" ], "script": "base64:BgIaCAISBAoCCAgSAwoBARIFCgMICAgSBAoCCAEZAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAAdrX2FkbWluAgdrX2FkbWluAAZrX3N0ZXACBmtfc3RlcAAMa19xdW90ZUFzc2V0AgxrX3F1b3RlQXNzZXQADGtfc3BvdE1hcmtldAIMa19zcG90TWFya2V0AA9rX2Z1dHVyZXNNYXJrZXQCD2tfZnV0dXJlc01hcmtldAATa19taW5JbmNyZWFzZVNwcmVhZAITa19taW5JbmNyZWFzZVNwcmVhZAAOa19wb3NpdGlvbkxvbmcCDmtfcG9zaXRpb25Mb25nAA9rX3Bvc2l0aW9uU2hvcnQCD2tfcG9zaXRpb25TaG9ydAAQa19wb3NpdGlvblNwcmVhZAIQa19wb3NpdGlvblNwcmVhZAAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAAlESVJfU0hPUlQAAgEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEMYWRtaW5BZGRyZXNzAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa19hZG1pbgENZ2V0UXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUMa19xdW90ZUFzc2V0AQ1nZXRTcG90TWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0ARBnZXRGdXR1cmVzTWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfZnV0dXJlc01hcmtldAUGX2Fzc2V0ARFtaW5JbmNyZWFzZVNwcmVhZAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFE2tfbWluSW5jcmVhc2VTcHJlYWQBC2dldFBvc2l0aW9uAQZfYXNzZXQECGxvbmdTaXplCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25Mb25nBQZfYXNzZXQAAAMJAAACBQhsb25nU2l6ZQAACQCVCgMAAAAAAAAJAJUKAwUIbG9uZ1NpemUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUPa19wb3NpdGlvblNob3J0BQZfYXNzZXQAAAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uU3ByZWFkBQZfYXNzZXQAAAEPZ2V0QXNzZXRCYWxhbmNlAQZfYXNzZXQDCQAAAgUGX2Fzc2V0AgVXQVZFUwgJAO8HAQUEdGhpcwdyZWd1bGFyCQDwBwIFBHRoaXMJANkEAQUGX2Fzc2V0AQlub3JtYWxpemUCB19hbW91bnQGX2Fzc2V0BAhkZWNpbWFscwMJAAACBQZfYXNzZXQCBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUGX2Fzc2V0CGRlY2ltYWxzAwkAAAIFCGRlY2ltYWxzAAgJAGkCBQdfYW1vdW50AGQDCQAAAgUIZGVjaW1hbHMABgUHX2Ftb3VudAkAAgECGkludmFsaWQgZGVjaW1hbHMgZm9yIGFzc2V0AQ51cGRhdGVQb3NpdGlvbgQGX2Fzc2V0DF9uZXdMb25nU2l6ZQ1fbmV3U2hvcnRTaXplDV9uZXdBdmdTcHJlYWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25Mb25nBQZfYXNzZXQFDF9uZXdMb25nU2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUPa19wb3NpdGlvblNob3J0BQZfYXNzZXQFDV9uZXdTaG9ydFNpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25TcHJlYWQFBl9hc3NldAUNX25ld0F2Z1NwcmVhZAUDbmlsBAFpAQppbml0aWFsaXplAgZfYWRtaW4LX3F1b3RlQXNzZXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlJbnZhbGlkIGluaXRpYWxpemUgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tfYWRtaW4FBl9hZG1pbgkAzAgCCQELU3RyaW5nRW50cnkCBQxrX3F1b3RlQXNzZXQFC19xdW90ZUFzc2V0BQNuaWwBaQEOY2hhbmdlU2V0dGluZ3MBEl9taW5JbmNyZWFzZVNwcmVhZAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19taW5JbmNyZWFzZVNwcmVhZAUSX21pbkluY3JlYXNlU3ByZWFkBQNuaWwBaQEJYWRkTWFya2V0AwZfYXNzZXQLX3Nwb3RNYXJrZXQOX2Z1dHVyZXNNYXJrZXQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIYSW52YWxpZCBhZGRNYXJrZXQgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0BQtfc3BvdE1hcmtldAkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX2Z1dHVyZXNNYXJrZXQFBl9hc3NldAUOX2Z1dHVyZXNNYXJrZXQFA25pbAFpARBpbmNyZWFzZVBvc2l0aW9uAgZfYXNzZXQPX3F1b3RlQXNzZXRTdGVwBApxdW90ZUFzc2V0CQENZ2V0UXVvdGVBc3NldAAECnNwb3RNYXJrZXQJAQ1nZXRTcG90TWFya2V0AQUGX2Fzc2V0BAthc3NldEJlZm9yZQkBD2dldEFzc2V0QmFsYW5jZQEFBl9hc3NldAMJAAACBQthc3NldEJlZm9yZQULYXNzZXRCZWZvcmUEB2J1eVNwb3QJAPwHBAUKc3BvdE1hcmtldAIEc3dhcAkAzAgCAAAJAMwIAgUGX2Fzc2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpxdW90ZUFzc2V0BQ9fcXVvdGVBc3NldFN0ZXAFA25pbAMJAAACBQdidXlTcG90BQdidXlTcG90BAphc3NldEFmdGVyCQEPZ2V0QXNzZXRCYWxhbmNlAQUGX2Fzc2V0AwkAAAIFCmFzc2V0QWZ0ZXIFCmFzc2V0QWZ0ZXIEC2Fzc2V0Qm91Z2h0CQBlAgUKYXNzZXRBZnRlcgULYXNzZXRCZWZvcmUED2Fzc2V0Qm91Z2h0Tm9ybQkBCW5vcm1hbGl6ZQIFC2Fzc2V0Qm91Z2h0BQZfYXNzZXQEEGJ1eVByaWNlTm9ybUZhY3QJAQRkaXZkAgUPX3F1b3RlQXNzZXRTdGVwBQ9hc3NldEJvdWdodE5vcm0EDWZ1dHVyZXNNYXJrZXQJARBnZXRGdXR1cmVzTWFya2V0AQUGX2Fzc2V0BAxzaG9ydEZ1dHVyZXMJAPwHBAUNZnV0dXJlc01hcmtldAIQaW5jcmVhc2VQb3NpdGlvbgkAzAgCBQlESVJfU0hPUlQJAMwIAgUMREVDSU1BTF9VTklUCQDMCAIAAAkAzAgCAgAJAMwIAgIABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnF1b3RlQXNzZXQFD19xdW90ZUFzc2V0U3RlcAUDbmlsAwkAAAIFDHNob3J0RnV0dXJlcwUMc2hvcnRGdXR1cmVzBAtwb3NpdGlvbktleQkArAICCQCsAgIJAKUIAQUEdGhpcwIBXwkApAMBBQlESVJfU0hPUlQED3Bvc2l0aW9uRnVsbEtleQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFC3Bvc2l0aW9uS2V5BA5hc3NldFNob3J0Tm9ybQkBEUBleHRyTmF0aXZlKDEwNTApAgUNZnV0dXJlc01hcmtldAUPcG9zaXRpb25GdWxsS2V5BBJzaG9ydFByaWNlTm9ybUZhY3QJAQRkaXZkAgUPX3F1b3RlQXNzZXRTdGVwBQ5hc3NldFNob3J0Tm9ybQQKc3ByZWFkRmFjdAkAZQIFDERFQ0lNQUxfVU5JVAkBBGRpdmQCBRBidXlQcmljZU5vcm1GYWN0BRJzaG9ydFByaWNlTm9ybUZhY3QDCQBmAgUKc3ByZWFkRmFjdAkBEW1pbkluY3JlYXNlU3ByZWFkAAQLJHQwNDk4MzUwNDEJAQtnZXRQb3NpdGlvbgEFBl9hc3NldAQIbG9uZ1NpemUIBQskdDA0OTgzNTA0MQJfMQQJc2hvcnRTaXplCAULJHQwNDk4MzUwNDECXzIECWF2Z1NwcmVhZAgFCyR0MDQ5ODM1MDQxAl8zBAtuZXdMb25nU2l6ZQkAZAIFCGxvbmdTaXplBQ9hc3NldEJvdWdodE5vcm0EDG5ld1Nob3J0U2l6ZQkAZAIFCXNob3J0U2l6ZQUOYXNzZXRTaG9ydE5vcm0EDG5ld0F2Z1NwcmVhZAkBBGRpdmQCCQBkAgkBBG11bGQCBQlhdmdTcHJlYWQJAGQCBQhsb25nU2l6ZQUJc2hvcnRTaXplCQEEbXVsZAIFCnNwcmVhZEZhY3QJAGQCBQ9hc3NldEJvdWdodE5vcm0FDmFzc2V0U2hvcnROb3JtCQBkAgkAZAIJAGQCBQhsb25nU2l6ZQUJc2hvcnRTaXplBQ9hc3NldEJvdWdodE5vcm0FDmFzc2V0U2hvcnROb3JtBARkYXRhCQDMCAIJAKQDAQUPYXNzZXRCb3VnaHROb3JtCQDMCAIJAKQDAQUQYnV5UHJpY2VOb3JtRmFjdAkAzAgCCQCkAwEFDmFzc2V0U2hvcnROb3JtCQDMCAIJAKQDAQUSc2hvcnRQcmljZU5vcm1GYWN0BQNuaWwJAAIBCQCsAgICEENvcnJlY3Qgc3ByZWFkOiAJALkJAgUEZGF0YQIBLAQEZGF0YQkAzAgCCQCkAwEFD2Fzc2V0Qm91Z2h0Tm9ybQkAzAgCCQCkAwEFEGJ1eVByaWNlTm9ybUZhY3QJAMwIAgkApAMBBQ5hc3NldFNob3J0Tm9ybQkAzAgCCQCkAwEFEnNob3J0UHJpY2VOb3JtRmFjdAUDbmlsCQACAQkArAICAhBJbnZhbGlkIHNwcmVhZDogCQC5CQIFBGRhdGECASwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AiUzdoA==", "height": 3663154, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: LzeLfp3sN6MQrMXXWxy3Axy4NHW1U768oPvzxufkTJZ Next: 7VasP6ukqs4aJ7ATmrimjy73qL5xwVkuBiXCFurMD6UT Diff:
OldNewDifferences
8787
8888
8989 @Callable(i)
90+func changeSettings (_minIncreaseSpread) = if ((i.caller != adminAddress()))
91+ then throw("Invalid changeSettings params")
92+ else [IntegerEntry(k_minIncreaseSpread, _minIncreaseSpread)]
93+
94+
95+
96+@Callable(i)
9097 func addMarket (_asset,_spotMarket,_futuresMarket) = if ((i.caller != adminAddress()))
9198 then throw("Invalid addMarket params")
9299 else [StringEntry(toCompositeKey(k_spotMarket, _asset), _spotMarket), StringEntry(toCompositeKey(k_futuresMarket, _asset), _futuresMarket)]
120127 let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
121128 if ((spreadFact > minIncreaseSpread()))
122129 then {
123- let $t047094767 = getPosition(_asset)
124- let longSize = $t047094767._1
125- let shortSize = $t047094767._2
126- let avgSpread = $t047094767._3
130+ let $t049835041 = getPosition(_asset)
131+ let longSize = $t049835041._1
132+ let shortSize = $t049835041._2
133+ let avgSpread = $t049835041._3
127134 let newLongSize = (longSize + assetBoughtNorm)
128135 let newShortSize = (shortSize + assetShortNorm)
129136 let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_initialized = "k_initialized"
55
66 let k_admin = "k_admin"
77
88 let k_step = "k_step"
99
1010 let k_quoteAsset = "k_quoteAsset"
1111
1212 let k_spotMarket = "k_spotMarket"
1313
1414 let k_futuresMarket = "k_futuresMarket"
1515
1616 let k_minIncreaseSpread = "k_minIncreaseSpread"
1717
1818 let k_positionLong = "k_positionLong"
1919
2020 let k_positionShort = "k_positionShort"
2121
2222 let k_positionSpread = "k_positionSpread"
2323
2424 let k_positionSize = "k_positionSize"
2525
2626 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
2727
2828 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
2929
3030
3131 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
3232
3333
3434 let DIR_SHORT = 2
3535
3636 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
3737
3838
3939 func adminAddress () = addressFromStringValue(getStringValue(this, k_admin))
4040
4141
4242 func getQuoteAsset () = fromBase58String(getStringValue(this, k_quoteAsset))
4343
4444
4545 func getSpotMarket (_asset) = addressFromStringValue(getStringValue(this, toCompositeKey(k_spotMarket, _asset)))
4646
4747
4848 func getFuturesMarket (_asset) = addressFromStringValue(getStringValue(this, toCompositeKey(k_futuresMarket, _asset)))
4949
5050
5151 func minIncreaseSpread () = getIntegerValue(this, k_minIncreaseSpread)
5252
5353
5454 func getPosition (_asset) = {
5555 let longSize = valueOrElse(getInteger(this, toCompositeKey(k_positionLong, _asset)), 0)
5656 if ((longSize == 0))
5757 then $Tuple3(0, 0, 0)
5858 else $Tuple3(longSize, valueOrElse(getInteger(this, toCompositeKey(k_positionShort, _asset)), 0), valueOrElse(getInteger(this, toCompositeKey(k_positionSpread, _asset)), 0))
5959 }
6060
6161
6262 func getAssetBalance (_asset) = if ((_asset == "WAVES"))
6363 then wavesBalance(this).regular
6464 else assetBalance(this, fromBase58String(_asset))
6565
6666
6767 func normalize (_amount,_asset) = {
6868 let decimals = if ((_asset == "WAVES"))
6969 then 8
7070 else value(assetInfo(fromBase58String(_asset))).decimals
7171 if ((decimals == 8))
7272 then (_amount / 100)
7373 else if ((decimals == 6))
7474 then _amount
7575 else throw("Invalid decimals for asset")
7676 }
7777
7878
7979 func updatePosition (_asset,_newLongSize,_newShortSize,_newAvgSpread) = [IntegerEntry(toCompositeKey(k_positionLong, _asset), _newLongSize), IntegerEntry(toCompositeKey(k_positionShort, _asset), _newShortSize), IntegerEntry(toCompositeKey(k_positionSpread, _asset), _newAvgSpread)]
8080
8181
8282 @Callable(i)
8383 func initialize (_admin,_quoteAsset) = if ((i.caller != this))
8484 then throw("Invalid initialize params")
8585 else [StringEntry(k_admin, _admin), StringEntry(k_quoteAsset, _quoteAsset)]
8686
8787
8888
8989 @Callable(i)
90+func changeSettings (_minIncreaseSpread) = if ((i.caller != adminAddress()))
91+ then throw("Invalid changeSettings params")
92+ else [IntegerEntry(k_minIncreaseSpread, _minIncreaseSpread)]
93+
94+
95+
96+@Callable(i)
9097 func addMarket (_asset,_spotMarket,_futuresMarket) = if ((i.caller != adminAddress()))
9198 then throw("Invalid addMarket params")
9299 else [StringEntry(toCompositeKey(k_spotMarket, _asset), _spotMarket), StringEntry(toCompositeKey(k_futuresMarket, _asset), _futuresMarket)]
93100
94101
95102
96103 @Callable(i)
97104 func increasePosition (_asset,_quoteAssetStep) = {
98105 let quoteAsset = getQuoteAsset()
99106 let spotMarket = getSpotMarket(_asset)
100107 let assetBefore = getAssetBalance(_asset)
101108 if ((assetBefore == assetBefore))
102109 then {
103110 let buySpot = invoke(spotMarket, "swap", [0, _asset, toString(this)], [AttachedPayment(quoteAsset, _quoteAssetStep)])
104111 if ((buySpot == buySpot))
105112 then {
106113 let assetAfter = getAssetBalance(_asset)
107114 if ((assetAfter == assetAfter))
108115 then {
109116 let assetBought = (assetAfter - assetBefore)
110117 let assetBoughtNorm = normalize(assetBought, _asset)
111118 let buyPriceNormFact = divd(_quoteAssetStep, assetBoughtNorm)
112119 let futuresMarket = getFuturesMarket(_asset)
113120 let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
114121 if ((shortFutures == shortFutures))
115122 then {
116123 let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
117124 let positionFullKey = toCompositeKey(k_positionSize, positionKey)
118125 let assetShortNorm = getIntegerValue(futuresMarket, positionFullKey)
119126 let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
120127 let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
121128 if ((spreadFact > minIncreaseSpread()))
122129 then {
123- let $t047094767 = getPosition(_asset)
124- let longSize = $t047094767._1
125- let shortSize = $t047094767._2
126- let avgSpread = $t047094767._3
130+ let $t049835041 = getPosition(_asset)
131+ let longSize = $t049835041._1
132+ let shortSize = $t049835041._2
133+ let avgSpread = $t049835041._3
127134 let newLongSize = (longSize + assetBoughtNorm)
128135 let newShortSize = (shortSize + assetShortNorm)
129136 let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
130137 let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact)]
131138 throw(("Correct spread: " + makeString(data, ",")))
132139 }
133140 else {
134141 let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact)]
135142 throw(("Invalid spread: " + makeString(data, ",")))
136143 }
137144 }
138145 else throw("Strict value is not equal to itself.")
139146 }
140147 else throw("Strict value is not equal to itself.")
141148 }
142149 else throw("Strict value is not equal to itself.")
143150 }
144151 else throw("Strict value is not equal to itself.")
145152 }
146153
147154

github/deemru/w8io/3ef1775 
43.68 ms