tx · 55GJUzcALJ8yTorrX4nwJuc3Fb88VMpHJSaHA2RozkUG

3P9qEs3aQgRgzBLo7hRvQahNRJvTTGoTWAP:  -0.00800000 Waves

2023.12.09 04:03 [3944336] smart account 3P9qEs3aQgRgzBLo7hRvQahNRJvTTGoTWAP > SELF 0.00000000 Waves

{ "type": 13, "id": "55GJUzcALJ8yTorrX4nwJuc3Fb88VMpHJSaHA2RozkUG", "fee": 800000, "feeAssetId": null, "timestamp": 1702083898016, "version": 1, "sender": "3P9qEs3aQgRgzBLo7hRvQahNRJvTTGoTWAP", "senderPublicKey": "82tJD4S4PqubHb5MGYkwokWMWR3LvY4UgyXTxsT6JWPn", "proofs": [ "5166JdqwKkvcYW19DcnRZokJuwZ66uhdKdPu6GkBQHa38EA26BrfjF22KQ7dkr7NE4SXq2tF6rbe473B88gNfTC5" ], "script": "base64:BgI6CAISAwoBBBIDCgEIEgcKBQgIAQEIEgcKBQgICAEBEgUKAwgICBIFCgMICAgSBQoDCAgIEgUKAwgICBkABVFVQU5UALDqAQAJTUFYX0NFTExTAHgACU1BWF9JTkRFWAkAZQIFCU1BWF9DRUxMUwABAARNSVNTAXj///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8ABENFTEwBeAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2dwAJUFJFQ0lTSU9OCQC2AgEAgICE/qbe4REABVpFUk83AQcAAAAAAAAAAARCaWcxCQC2AgEAAQAEQmlnMAkAtgIBAAAAE2xhc3RCbG9ja190aW1lc3RhbXAIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAZUMTVNSU4AoPc2AAVUSE9VUgCA3dsBAARUREFZAIC4mSkABlRNT05USACAkPvTCQAGQUNUSVZFCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMCBmFjdGl2ZQYBBWdldElkBAdhZGRyZXNzBmFzc2V0QQZhc3NldEIGY3JlYXRlBANrZXkJAKwCAgkArAICCQCsAgIJAKwCAgUHYWRkcmVzcwIBXwUGYXNzZXRBAgFfBQZhc3NldEIEAmlkCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAwkBAiE9AgUCaWQCAAUCaWQDBQZjcmVhdGUKAAFACQD8BwQFBHRoaXMCBW5ld0lkCQDMCAIFA2tleQUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQUBQAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nAgABCmxhc3RWYWx1ZXMBA2tleQQGdmFsdWVzCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgkwXzBfMF8wXzACAV8JAJcKBQkBBXZhbHVlAQkAqAMBCQCRAwIFBnZhbHVlcwAACQEFdmFsdWUBCQCoAwEJAJEDAgUGdmFsdWVzAAEJAQV2YWx1ZQEJAKgDAQkAkQMCBQZ2YWx1ZXMAAgkBBXZhbHVlAQkAqAMBCQCRAwIFBnZhbHVlcwADCQEFdmFsdWUBCQC2CQEJAJEDAgUGdmFsdWVzAAQBDWxhc3RGcm9tQ2VsbHMBBWNlbGxzCQCxCQEJAMwBAgUFY2VsbHMACAEMaGl0RnJvbUNlbGxzAgVieXRlcwVpbmRleAkAsQkBCQDLAQIFBVpFUk83CQDJAQIJAMoBAgUFYnl0ZXMFBWluZGV4AAEBBnNldEhpdAMDa2V5BWluZGV4C2xhc3RfcGVyaW9kBAckbWF0Y2gwCQCcCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAVjZWxscwUHJG1hdGNoMAMJAAACCQEMaGl0RnJvbUNlbGxzAgUFY2VsbHMFBWluZGV4AAAFA25pbAkAzAgCCQELQmluYXJ5RW50cnkCBQNrZXkJAMsBAgkAywECCQDJAQIFBWNlbGxzBQVpbmRleAkAyQECBQRDRUxMCQBlAgB4BQVpbmRleAkAzAECBQVjZWxscwAIBQNuaWwJAMwIAgkBC0JpbmFyeUVudHJ5AgUDa2V5CQDLAQIJAMsBAgkAyQECBQRNSVNTBQVpbmRleAkAyQECBQRDRUxMCQBlAgB4BQVpbmRleAkAmgMBBQtsYXN0X3BlcmlvZAUDbmlsAQduZWFyZXN0BAJpZAtzdGVwX3BlcmlvZAVzdGVwcwtwcmV2X3BlcmlvZAoBBmNvbW1vbgMFY2VsbHMGcGVyaW9kC2xhc3RfcGVyaW9kBAVpbmRleAMJAAACBQtsYXN0X3BlcmlvZAD///////////8BBQlNQVhfSU5ERVgJAGoCBQtsYXN0X3BlcmlvZAUJTUFYX0NFTExTBANoaXQJAQxoaXRGcm9tQ2VsbHMCBQVjZWxscwUFaW5kZXgDCQAAAgUDaGl0AP8BCQCVCgMGCQENbGFzdEZyb21DZWxscwEFBWNlbGxzAAAEC25leHRfcGVyaW9kCQBlAgkAZAIJAGgCBQZwZXJpb2QFCU1BWF9DRUxMUwUFaW5kZXgFA2hpdAkA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BQVwcmljZQIBXwkApgMBBQd2b2x1bWVBAgFfCQCmAwEFB3ZvbHVtZUIJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCAgR0d2FwBQZyZXN1bHQFA25pbAUGcmVzdWx0CAFpAQlzZXRBY3RpdmUBBmFjdGl2ZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEkludGVybmFsIGNhbGwgb25seQkAzAgCCQEMQm9vbGVhbkVudHJ5AgIGYWN0aXZlBQZhY3RpdmUFA25pbAFpAQVuZXdJZAEDa2V5AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQISSW50ZXJuYWwgY2FsbCBvbmx5BAlpZENvdW50ZXIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCA2lkcwAAAAEEAmlkCQCkAwEFCWlkQ291bnRlcgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgNpZHMFCWlkQ291bnRlcgkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmlkBQNrZXkJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUCaWQCBl9maXJzdAUTbGFzdEJsb2NrX3RpbWVzdGFtcAUDbmlsBQJpZAFpAQRwdXNoBQZhc3NldEEGYXNzZXRCB2Ftb3VudEEHYW1vdW50QgdwcmljZUFCBAJpZAkBBWdldElkBAkApQgBCAUBaQZjYWxsZXIFBmFzc2V0QQUGYXNzZXRCBgQFcHJpY2UDCQAAAgUHcHJpY2VBQgIACQC8AgMJALYCAQUHYW1vdW50QQUJUFJFQ0lTSU9OCQC2AgEFB2Ftb3VudEIDCQAAAgUHcHJpY2VBQgIBJQUEQmlnMAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEFB3ByaWNlQUICHHB1c2goKTogY2Fubm90IHBhcnNlIHByaWNlQUIEB3ZvbHVtZUEJALYCAQUHYW1vdW50QQQHdm9sdW1lQgMJAAACBQdwcmljZUFCAgElCQC8AgMJALYCAQUHYW1vdW50QQUJUFJFQ0lTSU9OCQC2AgEFB2Ftb3VudEIJALYCAQUHYW1vdW50QgQGcGVyaW9kCQBpAgUTbGFzdEJsb2NrX3RpbWVzdGFtcAUFUVVBTlQEB2lkX2xhc3QJAKwCAgUCaWQCBV9sYXN0BAwkdDA5OTE2MTAwMTUJAQpsYXN0VmFsdWVzAQUHaWRfbGFzdAQObGFzdF9wcmljZV9zdW0IBQwkdDA5OTE2MTAwMTUCXzEECmxhc3RfcHJpY2UIBQwkdDA5OTE2MTAwMTUCXzIEDGxhc3Rfdm9sdW1lQQgFDCR0MDk5MTYxMDAxNQJfMwQMbGFzdF92b2x1bWVCCAUMJHQwOTkxNjEwMDE1Al80BAtsYXN0X3BlcmlvZAgFDCR0MDk5MTYxMDAxNQJfNQQNJHQwMTAwMjAxMDUzNgMJAAACBQtsYXN0X3BlcmlvZAAACQCVCgMFBXByaWNlBQd2b2x1bWVBBQd2b2x1bWVCAwkAZgIFC2xhc3RfcGVyaW9kBQZwZXJpb2QJAAIBAhRVbmV4cGVjdGVkIHRpbWUgZmxvdwQHZ2FwX3N1bQkAvAIDBQpsYXN0X3ByaWNlCQC2AgEJAGUCCQBlAgUGcGVyaW9kBQtsYXN0X3BlcmlvZAABBQRCaWcxCQCVCgMJALcCAgkAtwICBQ5sYXN0X3ByaWNlX3N1bQUHZ2FwX3N1bQUFcHJpY2UJALcCAgUMbGFzdF92b2x1bWVBBQd2b2x1bWVBCQC3AgIFDGxhc3Rfdm9sdW1lQgUHdm9sdW1lQgQNbmV3X3ByaWNlX3N1bQgFDSR0MDEwMDIwMTA1MzYCXzEEC25ld192b2x1bWVBCAUNJHQwMTAwMjAxMDUzNgJfMgQLbmV3X3ZvbHVtZUIIBQ0kdDAxMDAyMDEwNTM2Al8zBANrZXkJAKwCAgkArAICBQJpZAIBXwkApAMBBQZwZXJpb2QECm5ld192YWx1ZXMJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUNbmV3X3ByaWNlX3N1bQIBXwkApgMBBQVwcmljZQIBXwkApgMBBQtuZXdfdm9sdW1lQQIBXwkApgMBBQtuZXdfdm9sdW1lQgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUKbmV3X3ZhbHVlcwkAzAgCCQELU3RyaW5nRW50cnkCBQdpZF9sYXN0CQCsAgIJAKwCAgUKbmV3X3ZhbHVlcwIBXwkApAMBBQZwZXJpb2QFA25pbAkBBG1hcmsDBQJpZAUGcGVyaW9kBQtsYXN0X3BlcmlvZAFpAQR0d2FwBQdhZGRyZXNzBmFzc2V0QQZhc3NldEIEZnJvbQJ0bwkBDHR3YXBJbnRlcm5hbAMJAQVnZXRJZAQFB2FkZHJlc3MFBmFzc2V0QQUGYXNzZXRCBwUEZnJvbQUCdG8BaQEGdHdhcDE1AwdhZGRyZXNzBmFzc2V0QQZhc3NldEIJAQx0d2FwSW50ZXJuYWwDCQEFZ2V0SWQEBQdhZGRyZXNzBQZhc3NldEEFBmFzc2V0QgcJAQEtAQUGVDE1TUlOAAABaQEIdHdhcEhPVVIDB2FkZHJlc3MGYXNzZXRBBmFzc2V0QgkBDHR3YXBJbnRlcm5hbAMJAQVnZXRJZAQFB2FkZHJlc3MFBmFzc2V0QQUGYXNzZXRCBwkBAS0BBQVUSE9VUgAAAWkBB3R3YXBEQVkDB2FkZHJlc3MGYXNzZXRBBmFzc2V0QgkBDHR3YXBJbnRlcm5hbAMJAQVnZXRJZAQFB2FkZHJlc3MFBmFzc2V0QQUGYXNzZXRCBwkBAS0BBQRUREFZAAABaQEJdHdhcE1PTlRIAwdhZGRyZXNzBmFzc2V0QQZhc3NldEIJAQx0d2FwSW50ZXJuYWwDCQEFZ2V0SWQEBQdhZGRyZXNzBQZhc3NldEEFBmFzc2V0QgcJAQEtAQUGVE1PTlRIAAAAgFUGFA==", "chainId": 87, "height": 3944336, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EeLhMsPKkfMeCcLiEEEsWzbL8oosYCvJe1chqjseGou2 Next: none Diff:
OldNewDifferences
278278 let id = getId(toString(i.caller), assetA, assetB, true)
279279 let price = if ((priceAB == ""))
280280 then fraction(toBigInt(amountA), PRECISION, toBigInt(amountB))
281- else valueOrErrorMessage(parseBigInt(priceAB), "push(): cannot parse priceAB")
281+ else if ((priceAB == "%"))
282+ then Big0
283+ else valueOrErrorMessage(parseBigInt(priceAB), "push(): cannot parse priceAB")
282284 let volumeA = toBigInt(amountA)
283- let volumeB = toBigInt(amountB)
285+ let volumeB = if ((priceAB == "%"))
286+ then fraction(toBigInt(amountA), PRECISION, toBigInt(amountB))
287+ else toBigInt(amountB)
284288 let period = (lastBlock_timestamp / QUANT)
285289 let id_last = (id + "_last")
286- let $t097199818 = lastValues(id_last)
287- let last_price_sum = $t097199818._1
288- let last_price = $t097199818._2
289- let last_volumeA = $t097199818._3
290- let last_volumeB = $t097199818._4
291- let last_period = $t097199818._5
292- let $t0982310339 = if ((last_period == 0))
290+ let $t0991610015 = lastValues(id_last)
291+ let last_price_sum = $t0991610015._1
292+ let last_price = $t0991610015._2
293+ let last_volumeA = $t0991610015._3
294+ let last_volumeB = $t0991610015._4
295+ let last_period = $t0991610015._5
296+ let $t01002010536 = if ((last_period == 0))
293297 then $Tuple3(price, volumeA, volumeB)
294298 else if ((last_period > period))
295299 then throw("Unexpected time flow")
297301 let gap_sum = fraction(last_price, toBigInt(((period - last_period) - 1)), Big1)
298302 $Tuple3(((last_price_sum + gap_sum) + price), (last_volumeA + volumeA), (last_volumeB + volumeB))
299303 }
300- let new_price_sum = $t0982310339._1
301- let new_volumeA = $t0982310339._2
302- let new_volumeB = $t0982310339._3
304+ let new_price_sum = $t01002010536._1
305+ let new_volumeA = $t01002010536._2
306+ let new_volumeB = $t01002010536._3
303307 let key = ((id + "_") + toString(period))
304308 let new_values = ((((((toString(new_price_sum) + "_") + toString(price)) + "_") + toString(new_volumeA)) + "_") + toString(new_volumeB))
305309 ([StringEntry(key, new_values), StringEntry(id_last, ((new_values + "_") + toString(period)))] ++ mark(id, period, last_period))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let QUANT = 30000
55
66 let MAX_CELLS = 120
77
88 let MAX_INDEX = (MAX_CELLS - 1)
99
1010 let MISS = base58'cV5GFKqAEHzMpSVgxZNfnSshMAWUKwrMGf7BnfGWecLnGSp8Cn8oe2cL1MVVzKbcBrcupnZxW6KLJ2w3TekHrEkszJr9VVSdZ6yMmEH7RNgR4M1jkykBM6M5hKjdDCZw2rGU8b5inXoL2kQswFLG9XCHYBS9vSGcmY7Q'
1111
1212 let CELL = base58'12qUPiDTnRmrmhCq8caXpQ1aJTHdJ28hGxW9j9vsVuAGJFZLj1C8XWiYnVJ5XPrMNJZA4FFRo5KfhuaCLJcGUNRAw4JQeYZRTaGG8owfnCzxhDhh9At9YAVA6CtHnbLgcMN6ns62CN7qsMGNASJm97bjo1uttCryNjG'
1313
1414 let PRECISION = toBigInt(10000000000000000)
1515
1616 let ZERO7 = base58'1111111'
1717
1818 let Big1 = toBigInt(1)
1919
2020 let Big0 = toBigInt(0)
2121
2222 let lastBlock_timestamp = lastBlock.timestamp
2323
2424 let T15MIN = 900000
2525
2626 let THOUR = 3600000
2727
2828 let TDAY = 86400000
2929
3030 let TMONTH = 2592000000
3131
3232 let ACTIVE = valueOrElse(getBoolean(this, "active"), true)
3333
3434 func getId (address,assetA,assetB,create) = {
3535 let key = ((((address + "_") + assetA) + "_") + assetB)
3636 let id = valueOrElse(getString(this, key), "")
3737 if ((id != ""))
3838 then id
3939 else if (create)
4040 then {
4141 let @ = invoke(this, "newId", [key], nil)
4242 if ($isInstanceOf(@, "String"))
4343 then @
4444 else throw(($getType(@) + " couldn't be cast to String"))
4545 }
4646 else ""
4747 }
4848
4949
5050 func lastValues (key) = {
5151 let values = split(valueOrElse(getString(this, key), "0_0_0_0_0"), "_")
5252 $Tuple5(value(parseBigInt(values[0])), value(parseBigInt(values[1])), value(parseBigInt(values[2])), value(parseBigInt(values[3])), value(parseInt(values[4])))
5353 }
5454
5555
5656 func lastFromCells (cells) = toInt(takeRight(cells, 8))
5757
5858
5959 func hitFromCells (bytes,index) = toInt((ZERO7 + take(drop(bytes, index), 1)))
6060
6161
6262 func setHit (key,index,last_period) = match getBinary(this, key) {
6363 case cells: ByteVector =>
6464 if ((hitFromCells(cells, index) == 0))
6565 then nil
6666 else [BinaryEntry(key, ((take(cells, index) + take(CELL, (120 - index))) + takeRight(cells, 8)))]
6767 case _ =>
6868 [BinaryEntry(key, ((take(MISS, index) + take(CELL, (120 - index))) + toBytes(last_period)))]
6969 }
7070
7171
7272 func nearest (id,step_period,steps,prev_period) = {
7373 func common (cells,period,last_period) = {
7474 let index = if ((last_period == -1))
7575 then MAX_INDEX
7676 else (last_period % MAX_CELLS)
7777 let hit = hitFromCells(cells, index)
7878 if ((hit == 255))
7979 then $Tuple3(true, lastFromCells(cells), 0)
8080 else {
8181 let next_period = (((period * MAX_CELLS) + index) - hit)
8282 $Tuple3(false, next_period, -1)
8383 }
8484 }
8585
8686 func fold (acc,step) = if (if ((acc._1 == true))
8787 then true
8888 else (step == ""))
8989 then acc
9090 else {
9191 let period = acc._2
9292 let data = getBinary(this, ((id + step) + toString(period)))
9393 if (isDefined(data))
9494 then common(value(data), period, acc._3)
9595 else if ((step != "_3_"))
9696 then $Tuple3(true, 0, 0)
9797 else {
9898 let period_lastChance = (period - 1)
9999 let data_lastChance = getBinary(this, ((id + step) + toString(period_lastChance)))
100100 if (isDefined(data_lastChance))
101101 then common(value(data_lastChance), period_lastChance, -1)
102102 else $Tuple3(true, 0, 0)
103103 }
104104 }
105105
106106 ( let $l = steps
107107 let $s = size($l)
108108 let $acc0 = $Tuple3(false, step_period, prev_period)
109109 func $f0_1 ($a,$i) = if (($i >= $s))
110110 then $a
111111 else fold($a, $l[$i])
112112
113113 func $f0_2 ($a,$i) = if (($i >= $s))
114114 then $a
115115 else throw("List size exceeds 3")
116116
117117 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3))._2
118118 }
119119
120120
121121 func dataByTimestamp (id,period) = {
122122 let key = ((id + "_") + toString(period))
123123 match getString(this, key) {
124124 case data: String =>
125125 $Tuple2(period, data)
126126 case _ =>
127127 func fold (acc,steps) = if ((acc._1 == true))
128128 then acc
129129 else {
130130 let prev_period = (acc._2 - 1)
131131 let step_period = (prev_period / MAX_CELLS)
132132 let nearest_period = nearest(id, step_period, steps, prev_period)
133133 if ((nearest_period == 0))
134134 then $Tuple2(false, step_period)
135135 else $Tuple2(true, nearest_period)
136136 }
137137
138138 let $t051375277 = {
139139 let $l = [["_1_", "", ""], ["_2_", "_1_", ""], ["_3_", "_2_", "_1_"]]
140140 let $s = size($l)
141141 let $acc0 = $Tuple2(false, period)
142142 func $f0_1 ($a,$i) = if (($i >= $s))
143143 then $a
144144 else fold($a, $l[$i])
145145
146146 func $f0_2 ($a,$i) = if (($i >= $s))
147147 then $a
148148 else throw("List size exceeds 3")
149149
150150 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
151151 }
152152 let found = $t051375277._1
153153 let nearest_period = $t051375277._2
154154 if (found)
155155 then $Tuple2(nearest_period, getStringValue(this, ((id + "_") + toString(nearest_period))))
156156 else $Tuple2(0, "")
157157 }
158158 }
159159
160160
161161 func mark (id,period,last_period) = {
162162 func fold (acc,step) = {
163163 let last_step_period = acc._1
164164 let step_period = (last_step_period / MAX_CELLS)
165165 let key = ((id + step) + toString(step_period))
166166 let index = (last_step_period % MAX_CELLS)
167167 let hit_actions = setHit(key, index, last_period)
168168 $Tuple2(step_period, (acc._2 ++ hit_actions))
169169 }
170170
171171 ( let $l = ["_1_", "_2_", "_3_"]
172172 let $s = size($l)
173173 let $acc0 = $Tuple2(period, nil)
174174 func $f0_1 ($a,$i) = if (($i >= $s))
175175 then $a
176176 else fold($a, $l[$i])
177177
178178 func $f0_2 ($a,$i) = if (($i >= $s))
179179 then $a
180180 else throw("List size exceeds 3")
181181
182182 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3))._2
183183 }
184184
185185
186186 func extend (p0,p1,sum,price) = (sum + fraction(price, toBigInt((p1 - p0)), Big1))
187187
188188
189189 func twapInternal (id,_t0,_t1) = {
190190 let result = if (!(ACTIVE))
191191 then "1_0_0_0_0"
192192 else if ((id == ""))
193193 then "2_0_0_0_0"
194194 else {
195195 let t_first = getIntegerValue(this, (id + "_first"))
196196 let t0_ = if ((0 >= _t0))
197197 then (lastBlock_timestamp + _t0)
198198 else _t0
199199 let t1_ = if ((0 >= _t1))
200200 then (lastBlock_timestamp + _t1)
201201 else _t1
202202 if ((t0_ > t1_))
203203 then throw("t0 > t1")
204204 else {
205205 let $t068846969 = if ((t_first > t0_))
206206 then $Tuple2(t_first, true)
207207 else $Tuple2(t0_, false)
208208 let t0 = $t068846969._1
209209 let is_first = $t068846969._2
210210 let t1 = if ((t_first > t1_))
211211 then t_first
212212 else t1_
213213 let p0 = (t0 / QUANT)
214214 let p1 = (t1 / QUANT)
215215 if ((p0 == p1))
216216 then "3_0_0_0_0"
217217 else {
218218 let $t071457193 = dataByTimestamp(id, p0)
219219 let found_p0 = $t071457193._1
220220 let v0 = $t071457193._2
221221 let $t071987246 = dataByTimestamp(id, p1)
222222 let found_p1 = $t071987246._1
223223 let v1 = $t071987246._2
224224 if ((found_p0 == 0))
225225 then "4_0_0_0_0"
226226 else if ((found_p1 == 0))
227227 then "5_0_0_0_0"
228228 else {
229229 let vs0 = split(v0, "_")
230230 let vs1 = split(v1, "_")
231231 let found_sum0 = value(parseBigInt(vs0[0]))
232232 let found_price0 = value(parseBigInt(vs0[1]))
233233 let found_volumeA0 = if (is_first)
234234 then Big0
235235 else value(parseBigInt(vs0[2]))
236236 let found_volumeB0 = if (is_first)
237237 then Big0
238238 else value(parseBigInt(vs0[3]))
239239 let sum0 = extend(found_p0, p0, found_sum0, found_price0)
240240 let found_sum1 = value(parseBigInt(vs1[0]))
241241 let found_price1 = value(parseBigInt(vs1[1]))
242242 let found_volumeA1 = value(parseBigInt(vs1[2]))
243243 let found_volumeB1 = value(parseBigInt(vs1[3]))
244244 let sum1 = extend(found_p1, p1, found_sum1, found_price1)
245245 let twap = fraction((sum1 - sum0), Big1, toBigInt((p1 - p0)))
246246 let price = found_price1
247247 let volumeA = (found_volumeA1 - found_volumeA0)
248248 let volumeB = (found_volumeB1 - found_volumeB0)
249249 ((((((("0_" + toString(twap)) + "_") + toString(price)) + "_") + toString(volumeA)) + "_") + toString(volumeB))
250250 }
251251 }
252252 }
253253 }
254254 $Tuple2([StringEntry("twap", result)], result)
255255 }
256256
257257
258258 @Callable(i)
259259 func setActive (active) = if ((i.caller != this))
260260 then throw("Internal call only")
261261 else [BooleanEntry("active", active)]
262262
263263
264264
265265 @Callable(i)
266266 func newId (key) = if ((i.caller != this))
267267 then throw("Internal call only")
268268 else {
269269 let idCounter = (valueOrElse(getInteger(this, "ids"), 0) + 1)
270270 let id = toString(idCounter)
271271 $Tuple2([IntegerEntry("ids", idCounter), StringEntry(key, id), StringEntry(id, key), IntegerEntry((id + "_first"), lastBlock_timestamp)], id)
272272 }
273273
274274
275275
276276 @Callable(i)
277277 func push (assetA,assetB,amountA,amountB,priceAB) = {
278278 let id = getId(toString(i.caller), assetA, assetB, true)
279279 let price = if ((priceAB == ""))
280280 then fraction(toBigInt(amountA), PRECISION, toBigInt(amountB))
281- else valueOrErrorMessage(parseBigInt(priceAB), "push(): cannot parse priceAB")
281+ else if ((priceAB == "%"))
282+ then Big0
283+ else valueOrErrorMessage(parseBigInt(priceAB), "push(): cannot parse priceAB")
282284 let volumeA = toBigInt(amountA)
283- let volumeB = toBigInt(amountB)
285+ let volumeB = if ((priceAB == "%"))
286+ then fraction(toBigInt(amountA), PRECISION, toBigInt(amountB))
287+ else toBigInt(amountB)
284288 let period = (lastBlock_timestamp / QUANT)
285289 let id_last = (id + "_last")
286- let $t097199818 = lastValues(id_last)
287- let last_price_sum = $t097199818._1
288- let last_price = $t097199818._2
289- let last_volumeA = $t097199818._3
290- let last_volumeB = $t097199818._4
291- let last_period = $t097199818._5
292- let $t0982310339 = if ((last_period == 0))
290+ let $t0991610015 = lastValues(id_last)
291+ let last_price_sum = $t0991610015._1
292+ let last_price = $t0991610015._2
293+ let last_volumeA = $t0991610015._3
294+ let last_volumeB = $t0991610015._4
295+ let last_period = $t0991610015._5
296+ let $t01002010536 = if ((last_period == 0))
293297 then $Tuple3(price, volumeA, volumeB)
294298 else if ((last_period > period))
295299 then throw("Unexpected time flow")
296300 else {
297301 let gap_sum = fraction(last_price, toBigInt(((period - last_period) - 1)), Big1)
298302 $Tuple3(((last_price_sum + gap_sum) + price), (last_volumeA + volumeA), (last_volumeB + volumeB))
299303 }
300- let new_price_sum = $t0982310339._1
301- let new_volumeA = $t0982310339._2
302- let new_volumeB = $t0982310339._3
304+ let new_price_sum = $t01002010536._1
305+ let new_volumeA = $t01002010536._2
306+ let new_volumeB = $t01002010536._3
303307 let key = ((id + "_") + toString(period))
304308 let new_values = ((((((toString(new_price_sum) + "_") + toString(price)) + "_") + toString(new_volumeA)) + "_") + toString(new_volumeB))
305309 ([StringEntry(key, new_values), StringEntry(id_last, ((new_values + "_") + toString(period)))] ++ mark(id, period, last_period))
306310 }
307311
308312
309313
310314 @Callable(i)
311315 func twap (address,assetA,assetB,from,to) = twapInternal(getId(address, assetA, assetB, false), from, to)
312316
313317
314318
315319 @Callable(i)
316320 func twap15 (address,assetA,assetB) = twapInternal(getId(address, assetA, assetB, false), -(T15MIN), 0)
317321
318322
319323
320324 @Callable(i)
321325 func twapHOUR (address,assetA,assetB) = twapInternal(getId(address, assetA, assetB, false), -(THOUR), 0)
322326
323327
324328
325329 @Callable(i)
326330 func twapDAY (address,assetA,assetB) = twapInternal(getId(address, assetA, assetB, false), -(TDAY), 0)
327331
328332
329333
330334 @Callable(i)
331335 func twapMONTH (address,assetA,assetB) = twapInternal(getId(address, assetA, assetB, false), -(TMONTH), 0)
332336
333337

github/deemru/w8io/3ef1775 
47.62 ms