tx · GgAtmJYCUJs8QnKqQBkWW5aRZBoK6aSk7qU541N6gHg3

3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT:  -0.01000000 Waves

2023.05.28 12:22 [3663169] smart account 3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT > SELF 0.00000000 Waves

{ "type": 13, "id": "GgAtmJYCUJs8QnKqQBkWW5aRZBoK6aSk7qU541N6gHg3", "fee": 1000000, "feeAssetId": null, "timestamp": 1685265747345, "version": 2, "chainId": 87, "sender": "3PPEo6YV7XpCFknum9FNVLQuCu3x7AogcJT", "senderPublicKey": "7kuQGHmvhzQW3ERxGyMrxfq3LuxHSJ6UdBZcuy498sf6", "proofs": [ "34sEww5gC1YfJuqWqScx4EJ5hrPySPDCUx445oqbqxE6vUBkMLyqorqa1PrKCPh2vXXH5UNciY1BskYpnwhSACEC" ], "script": "base64:BgIaCAISBAoCCAgSAwoBARIFCgMICAgSBAoCCAEZAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAAdrX2FkbWluAgdrX2FkbWluAAZrX3N0ZXACBmtfc3RlcAAMa19xdW90ZUFzc2V0AgxrX3F1b3RlQXNzZXQADGtfc3BvdE1hcmtldAIMa19zcG90TWFya2V0AA9rX2Z1dHVyZXNNYXJrZXQCD2tfZnV0dXJlc01hcmtldAATa19taW5JbmNyZWFzZVNwcmVhZAITa19taW5JbmNyZWFzZVNwcmVhZAAOa19wb3NpdGlvbkxvbmcCDmtfcG9zaXRpb25Mb25nAA9rX3Bvc2l0aW9uU2hvcnQCD2tfcG9zaXRpb25TaG9ydAAQa19wb3NpdGlvblNwcmVhZAIQa19wb3NpdGlvblNwcmVhZAAOa19wb3NpdGlvblNpemUCDmtfcG9zaXRpb25TaXplAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgEEZGl2ZAICX3gCX3kJAG4EBQJfeAUMREVDSU1BTF9VTklUBQJfeQUISEFMRkVWRU4BBG11bGQCAl94Al95CQBuBAUCX3gFAl95BQxERUNJTUFMX1VOSVQFCEhBTEZFVkVOAAlESVJfU0hPUlQAAgEOdG9Db21wb3NpdGVLZXkCBF9rZXkIX2FkZHJlc3MJAKwCAgkArAICBQRfa2V5AgFfBQhfYWRkcmVzcwEMYWRtaW5BZGRyZXNzAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa19hZG1pbgENZ2V0UXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUMa19xdW90ZUFzc2V0AQ1nZXRTcG90TWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0ARBnZXRGdXR1cmVzTWFya2V0AQZfYXNzZXQJARFAZXh0ck5hdGl2ZSgxMDYyKQEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFD2tfZnV0dXJlc01hcmtldAUGX2Fzc2V0ARFtaW5JbmNyZWFzZVNwcmVhZAAJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFE2tfbWluSW5jcmVhc2VTcHJlYWQBC2dldFBvc2l0aW9uAQZfYXNzZXQECGxvbmdTaXplCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25Mb25nBQZfYXNzZXQAAAMJAAACBQhsb25nU2l6ZQAACQCVCgMAAAAAAAAJAJUKAwUIbG9uZ1NpemUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBDnRvQ29tcG9zaXRlS2V5AgUPa19wb3NpdGlvblNob3J0BQZfYXNzZXQAAAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEOdG9Db21wb3NpdGVLZXkCBRBrX3Bvc2l0aW9uU3ByZWFkBQZfYXNzZXQAAAEPZ2V0QXNzZXRCYWxhbmNlAQZfYXNzZXQDCQAAAgUGX2Fzc2V0AgVXQVZFUwgJAO8HAQUEdGhpcwdyZWd1bGFyCQDwBwIFBHRoaXMJANkEAQUGX2Fzc2V0AQlub3JtYWxpemUCB19hbW91bnQGX2Fzc2V0BAhkZWNpbWFscwMJAAACBQZfYXNzZXQCBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUGX2Fzc2V0CGRlY2ltYWxzAwkAAAIFCGRlY2ltYWxzAAgJAGkCBQdfYW1vdW50AGQDCQAAAgUIZGVjaW1hbHMABgUHX2Ftb3VudAkAAgECGkludmFsaWQgZGVjaW1hbHMgZm9yIGFzc2V0AQ51cGRhdGVQb3NpdGlvbgQGX2Fzc2V0DF9uZXdMb25nU2l6ZQ1fbmV3U2hvcnRTaXplDV9uZXdBdmdTcHJlYWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25Mb25nBQZfYXNzZXQFDF9uZXdMb25nU2l6ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUPa19wb3NpdGlvblNob3J0BQZfYXNzZXQFDV9uZXdTaG9ydFNpemUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFEGtfcG9zaXRpb25TcHJlYWQFBl9hc3NldAUNX25ld0F2Z1NwcmVhZAUDbmlsBAFpAQppbml0aWFsaXplAgZfYWRtaW4LX3F1b3RlQXNzZXQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhlJbnZhbGlkIGluaXRpYWxpemUgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2tfYWRtaW4FBl9hZG1pbgkAzAgCCQELU3RyaW5nRW50cnkCBQxrX3F1b3RlQXNzZXQFC19xdW90ZUFzc2V0BQNuaWwBaQEOY2hhbmdlU2V0dGluZ3MBEl9taW5JbmNyZWFzZVNwcmVhZAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh1JbnZhbGlkIGNoYW5nZVNldHRpbmdzIHBhcmFtcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa19taW5JbmNyZWFzZVNwcmVhZAUSX21pbkluY3JlYXNlU3ByZWFkBQNuaWwBaQEJYWRkTWFya2V0AwZfYXNzZXQLX3Nwb3RNYXJrZXQOX2Z1dHVyZXNNYXJrZXQDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIYSW52YWxpZCBhZGRNYXJrZXQgcGFyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ50b0NvbXBvc2l0ZUtleQIFDGtfc3BvdE1hcmtldAUGX2Fzc2V0BQtfc3BvdE1hcmtldAkAzAgCCQELU3RyaW5nRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBQ9rX2Z1dHVyZXNNYXJrZXQFBl9hc3NldAUOX2Z1dHVyZXNNYXJrZXQFA25pbAFpARBpbmNyZWFzZVBvc2l0aW9uAgZfYXNzZXQPX3F1b3RlQXNzZXRTdGVwBApxdW90ZUFzc2V0CQENZ2V0UXVvdGVBc3NldAAECnNwb3RNYXJrZXQJAQ1nZXRTcG90TWFya2V0AQUGX2Fzc2V0BAthc3NldEJlZm9yZQkBD2dldEFzc2V0QmFsYW5jZQEFBl9hc3NldAMJAAACBQthc3NldEJlZm9yZQULYXNzZXRCZWZvcmUEB2J1eVNwb3QJAPwHBAUKc3BvdE1hcmtldAIEc3dhcAkAzAgCAAAJAMwIAgUGX2Fzc2V0CQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQpxdW90ZUFzc2V0BQ9fcXVvdGVBc3NldFN0ZXAFA25pbAMJAAACBQdidXlTcG90BQdidXlTcG90BAphc3NldEFmdGVyCQEPZ2V0QXNzZXRCYWxhbmNlAQUGX2Fzc2V0AwkAAAIFCmFzc2V0QWZ0ZXIFCmFzc2V0QWZ0ZXIEC2Fzc2V0Qm91Z2h0CQBlAgUKYXNzZXRBZnRlcgULYXNzZXRCZWZvcmUED2Fzc2V0Qm91Z2h0Tm9ybQkBCW5vcm1hbGl6ZQIFC2Fzc2V0Qm91Z2h0BQZfYXNzZXQEEGJ1eVByaWNlTm9ybUZhY3QJAQRkaXZkAgUPX3F1b3RlQXNzZXRTdGVwBQ9hc3NldEJvdWdodE5vcm0EDWZ1dHVyZXNNYXJrZXQJARBnZXRGdXR1cmVzTWFya2V0AQUGX2Fzc2V0BAxzaG9ydEZ1dHVyZXMJAPwHBAUNZnV0dXJlc01hcmtldAIQaW5jcmVhc2VQb3NpdGlvbgkAzAgCBQlESVJfU0hPUlQJAMwIAgUMREVDSU1BTF9VTklUCQDMCAIAAAkAzAgCAgAJAMwIAgIABQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCnF1b3RlQXNzZXQFD19xdW90ZUFzc2V0U3RlcAUDbmlsAwkAAAIFDHNob3J0RnV0dXJlcwUMc2hvcnRGdXR1cmVzBAtwb3NpdGlvbktleQkArAICCQCsAgIJAKUIAQUEdGhpcwIBXwkApAMBBQlESVJfU0hPUlQED3Bvc2l0aW9uRnVsbEtleQkBDnRvQ29tcG9zaXRlS2V5AgUOa19wb3NpdGlvblNpemUFC3Bvc2l0aW9uS2V5BA5hc3NldFNob3J0Tm9ybQkBAS0BCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1mdXR1cmVzTWFya2V0BQ9wb3NpdGlvbkZ1bGxLZXkEEnNob3J0UHJpY2VOb3JtRmFjdAkBBGRpdmQCBQ9fcXVvdGVBc3NldFN0ZXAFDmFzc2V0U2hvcnROb3JtBApzcHJlYWRGYWN0CQBlAgUMREVDSU1BTF9VTklUCQEEZGl2ZAIFEGJ1eVByaWNlTm9ybUZhY3QFEnNob3J0UHJpY2VOb3JtRmFjdAQJbWluU3ByZWFkCQERbWluSW5jcmVhc2VTcHJlYWQAAwkAZgIFCnNwcmVhZEZhY3QFCW1pblNwcmVhZAQLJHQwNTAxNDUwNzIJAQtnZXRQb3NpdGlvbgEFBl9hc3NldAQIbG9uZ1NpemUIBQskdDA1MDE0NTA3MgJfMQQJc2hvcnRTaXplCAULJHQwNTAxNDUwNzICXzIECWF2Z1NwcmVhZAgFCyR0MDUwMTQ1MDcyAl8zBAtuZXdMb25nU2l6ZQkAZAIFCGxvbmdTaXplBQ9hc3NldEJvdWdodE5vcm0EDG5ld1Nob3J0U2l6ZQkAZAIFCXNob3J0U2l6ZQUOYXNzZXRTaG9ydE5vcm0EDG5ld0F2Z1NwcmVhZAkBBGRpdmQCCQBkAgkBBG11bGQCBQlhdmdTcHJlYWQJAGQCBQhsb25nU2l6ZQUJc2hvcnRTaXplCQEEbXVsZAIFCnNwcmVhZEZhY3QJAGQCBQ9hc3NldEJvdWdodE5vcm0FDmFzc2V0U2hvcnROb3JtCQBkAgkAZAIJAGQCBQhsb25nU2l6ZQUJc2hvcnRTaXplBQ9hc3NldEJvdWdodE5vcm0FDmFzc2V0U2hvcnROb3JtCQEOdXBkYXRlUG9zaXRpb24EBQZfYXNzZXQFC25ld0xvbmdTaXplBQxuZXdTaG9ydFNpemUFDG5ld0F2Z1NwcmVhZAQEZGF0YQkAzAgCCQCkAwEFD2Fzc2V0Qm91Z2h0Tm9ybQkAzAgCCQCkAwEFEGJ1eVByaWNlTm9ybUZhY3QJAMwIAgkApAMBBQ5hc3NldFNob3J0Tm9ybQkAzAgCCQCkAwEFEnNob3J0UHJpY2VOb3JtRmFjdAkAzAgCCQCkAwEFCnNwcmVhZEZhY3QJAMwIAgkApAMBBQltaW5TcHJlYWQFA25pbAkAAgEJAKwCAgIQSW52YWxpZCBzcHJlYWQ6IAkAuQkCBQRkYXRhAgEsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAIRqA5s=", "height": 3663169, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GGLp8hvTkhz166BmKSae7EvK7C7r6Tu6jvx6DJkhQJDy Next: 33LTp7GzK57XGqba9MPmw1NEukQCHKAQrEQ6ZoMj77pi Diff:
OldNewDifferences
135135 let newLongSize = (longSize + assetBoughtNorm)
136136 let newShortSize = (shortSize + assetShortNorm)
137137 let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
138- let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
139- throw(("Correct spread: " + makeString(data, ",")))
138+ updatePosition(_asset, newLongSize, newShortSize, newAvgSpread)
140139 }
141140 else {
142141 let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
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)
9090 func changeSettings (_minIncreaseSpread) = if ((i.caller != adminAddress()))
9191 then throw("Invalid changeSettings params")
9292 else [IntegerEntry(k_minIncreaseSpread, _minIncreaseSpread)]
9393
9494
9595
9696 @Callable(i)
9797 func addMarket (_asset,_spotMarket,_futuresMarket) = if ((i.caller != adminAddress()))
9898 then throw("Invalid addMarket params")
9999 else [StringEntry(toCompositeKey(k_spotMarket, _asset), _spotMarket), StringEntry(toCompositeKey(k_futuresMarket, _asset), _futuresMarket)]
100100
101101
102102
103103 @Callable(i)
104104 func increasePosition (_asset,_quoteAssetStep) = {
105105 let quoteAsset = getQuoteAsset()
106106 let spotMarket = getSpotMarket(_asset)
107107 let assetBefore = getAssetBalance(_asset)
108108 if ((assetBefore == assetBefore))
109109 then {
110110 let buySpot = invoke(spotMarket, "swap", [0, _asset, toString(this)], [AttachedPayment(quoteAsset, _quoteAssetStep)])
111111 if ((buySpot == buySpot))
112112 then {
113113 let assetAfter = getAssetBalance(_asset)
114114 if ((assetAfter == assetAfter))
115115 then {
116116 let assetBought = (assetAfter - assetBefore)
117117 let assetBoughtNorm = normalize(assetBought, _asset)
118118 let buyPriceNormFact = divd(_quoteAssetStep, assetBoughtNorm)
119119 let futuresMarket = getFuturesMarket(_asset)
120120 let shortFutures = invoke(futuresMarket, "increasePosition", [DIR_SHORT, DECIMAL_UNIT, 0, "", ""], [AttachedPayment(quoteAsset, _quoteAssetStep)])
121121 if ((shortFutures == shortFutures))
122122 then {
123123 let positionKey = ((toString(this) + "_") + toString(DIR_SHORT))
124124 let positionFullKey = toCompositeKey(k_positionSize, positionKey)
125125 let assetShortNorm = -(getIntegerValue(futuresMarket, positionFullKey))
126126 let shortPriceNormFact = divd(_quoteAssetStep, assetShortNorm)
127127 let spreadFact = (DECIMAL_UNIT - divd(buyPriceNormFact, shortPriceNormFact))
128128 let minSpread = minIncreaseSpread()
129129 if ((spreadFact > minSpread))
130130 then {
131131 let $t050145072 = getPosition(_asset)
132132 let longSize = $t050145072._1
133133 let shortSize = $t050145072._2
134134 let avgSpread = $t050145072._3
135135 let newLongSize = (longSize + assetBoughtNorm)
136136 let newShortSize = (shortSize + assetShortNorm)
137137 let newAvgSpread = divd((muld(avgSpread, (longSize + shortSize)) + muld(spreadFact, (assetBoughtNorm + assetShortNorm))), (((longSize + shortSize) + assetBoughtNorm) + assetShortNorm))
138- let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
139- throw(("Correct spread: " + makeString(data, ",")))
138+ updatePosition(_asset, newLongSize, newShortSize, newAvgSpread)
140139 }
141140 else {
142141 let data = [toString(assetBoughtNorm), toString(buyPriceNormFact), toString(assetShortNorm), toString(shortPriceNormFact), toString(spreadFact), toString(minSpread)]
143142 throw(("Invalid spread: " + makeString(data, ",")))
144143 }
145144 }
146145 else throw("Strict value is not equal to itself.")
147146 }
148147 else throw("Strict value is not equal to itself.")
149148 }
150149 else throw("Strict value is not equal to itself.")
151150 }
152151 else throw("Strict value is not equal to itself.")
153152 }
154153
155154

github/deemru/w8io/6500d08 
30.00 ms