tx · G5Vymh4HRiCbh7APDcwffmax3Acx4fob3UhaDNW5NWxH

3NBbFNBed9tcU5AmsJAuExWvgJyNmJxqjWq:  -0.01000000 Waves

2023.09.10 00:35 [2748402] smart account 3NBbFNBed9tcU5AmsJAuExWvgJyNmJxqjWq > SELF 0.00000000 Waves

{ "type": 13, "id": "G5Vymh4HRiCbh7APDcwffmax3Acx4fob3UhaDNW5NWxH", "fee": 1000000, "feeAssetId": null, "timestamp": 1694295369982, "version": 2, "chainId": 84, "sender": "3NBbFNBed9tcU5AmsJAuExWvgJyNmJxqjWq", "senderPublicKey": "ERewvWFUFQfR1eCnipNAv9n7SdQhof2ESP6PGVjTueLd", "proofs": [ "3PZ2JeFMobpbosKKi3XpD4hC2nBQ7JCuMVfjECWUxV9ucjX3C8s5As5BYMUfTxYgTnfL4ud5cE3EemceZU6SPgPp" ], "script": "base64:BgILCAISABIAEgMKAQEHAAZ1c2RuSWQBIA/yHBKs5MQ8muxGGqslqLDsugcrRsxtiHLwteKSSQG0AA53YXZlczJMVG9rZW5JZAEg5M0p6rvBF5U2UTZL5Gl9iE5RU627hhSF/AmO2XdvzrEADHB1enpsZUxlbmRTQwIjM04zRG5WZmZuVXladHoyTVJiazVVN2dpTjExMldlbXBNTmQAEGZha2VQdXp6bGVTd2FwU0MCIzNNczhmcWJYTTRSaG1NNkNQVHI0NGhVd0hlMkNDbVZDZlZBAA51c2RuQWRkcmVzc1N0cgIsMjVGRXFFalJrcUs2eUNraVQ3THo2U0FZejdnVUZDdHhmQ0NobnJWRkQ1QVQAD3dhdmVzMkxUb2tlblN0cgIsR1E5UU5WTEdmWVNiTlo0ZFM4TlJ5dkdHRUxaTDRzV1BLaVZqODhDVjFySkwBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAADAWkBCW1pbnRMb25nMgADAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAJAAIBAiExIHBheW1lbnQgaGFzIHRvIGJlIGF0dGFjaGVkIG1pbnQEDWZpcnN0QW1vdW50SW4ICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BAhjYWxsZXJJZAkApQgBCAUBaQZjYWxsZXIEF2ZpcnN0U3dhcHBlZFdhdmVzQW1vdW50CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEGZha2VQdXp6bGVTd2FwU0MCC3N3YXBUb1dhdmVzCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFDWZpcnN0QW1vdW50SW4FA25pbAUDbmlsAwkAAAIFF2ZpcnN0U3dhcHBlZFdhdmVzQW1vdW50BRdmaXJzdFN3YXBwZWRXYXZlc0Ftb3VudAQHJG1hdGNoMAUXZmlyc3RTd2FwcGVkV2F2ZXNBbW91bnQDCQABAgUHJG1hdGNoMAIDSW50BBdmaXJzdFN3YXBwZWRBbW91bnRWYWx1ZQUHJG1hdGNoMAQZZmlyc3REZXBvc2l0ZWRXYXZlc0Ftb3VudAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQxwdXp6bGVMZW5kU0MCBnN1cHBseQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQR1bml0BRdmaXJzdFN3YXBwZWRBbW91bnRWYWx1ZQUDbmlsAwkAAAIFGWZpcnN0RGVwb3NpdGVkV2F2ZXNBbW91bnQFGWZpcnN0RGVwb3NpdGVkV2F2ZXNBbW91bnQEDmxpc3RQZXJjZW50YWdlCQDMCAIA8KIECQDMCAIA6P4CCQDMCAIA/IsCCQDMCAIAyrsBCQDMCAIAp4MBBQNuaWwKAQpyZXBlYXRGdW5jAgVhY2N1bQRuZXh0BAxib3Jyb3dlZFVzZG4JAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHV6emxlTGVuZFNDAgZib3Jyb3cJAMwIAgUOdXNkbkFkZHJlc3NTdHIJAMwIAgkAaQIJAGgCBQ1maXJzdEFtb3VudEluBQVhY2N1bQCgjQYFA25pbAUDbmlsAwkAAAIFDGJvcnJvd2VkVXNkbgUMYm9ycm93ZWRVc2RuBA1zd2FwcGVkQW1vdW50CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEGZha2VQdXp6bGVTd2FwU0MCC3N3YXBUb1dhdmVzCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAGkCCQBoAgUXZmlyc3RTd2FwcGVkQW1vdW50VmFsdWUFBWFjY3VtAKCNBgUDbmlsBQNuaWwDCQAAAgUNc3dhcHBlZEFtb3VudAUNc3dhcHBlZEFtb3VudAQHJG1hdGNoMQUNc3dhcHBlZEFtb3VudAMJAAECBQckbWF0Y2gxAgNJbnQEEnN3YXBwZWRBbW91bnRWYWx1ZQUHJG1hdGNoMQQOZGVwb3NpdGVkV2F2ZXMJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHV6emxlTGVuZFNDAgZzdXBwbHkFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUSc3dhcHBlZEFtb3VudFZhbHVlBQNuaWwDCQAAAgUOZGVwb3NpdGVkV2F2ZXMFDmRlcG9zaXRlZFdhdmVzCQBkAgkAaQIJAGgCBRdmaXJzdFN3YXBwZWRBbW91bnRWYWx1ZQUFYWNjdW0AoI0GCQBpAgkAaAIFF2ZpcnN0U3dhcHBlZEFtb3VudFZhbHVlBQRuZXh0AKCNBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECF0luY29ycmVjdCBpbnZva2UgcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANyZXMKAAIkbAUObGlzdFBlcmNlbnRhZ2UKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCnJlcGVhdEZ1bmMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUDcmVzBQ53YXZlczJMVG9rZW5JZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIXSW5jb3JyZWN0IGludm9rZSByZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEObWludExvbmcyX3Rlc3QAAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIhMSBwYXltZW50IGhhcyB0byBiZSBhdHRhY2hlZCBtaW50BA1maXJzdEFtb3VudEluCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQIY2FsbGVySWQJAKUIAQgFAWkGY2FsbGVyBBdmaXJzdFN3YXBwZWRXYXZlc0Ftb3VudAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBRBmYWtlUHV6emxlU3dhcFNDAgtzd2FwVG9XYXZlcwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCBQ1maXJzdEFtb3VudEluBQNuaWwFA25pbAMJAAACBRdmaXJzdFN3YXBwZWRXYXZlc0Ftb3VudAUXZmlyc3RTd2FwcGVkV2F2ZXNBbW91bnQEByRtYXRjaDAFF2ZpcnN0U3dhcHBlZFdhdmVzQW1vdW50AwkAAQIFByRtYXRjaDACA0ludAQXZmlyc3RTd2FwcGVkQW1vdW50VmFsdWUFByRtYXRjaDAEGWZpcnN0RGVwb3NpdGVkV2F2ZXNBbW91bnQJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUMcHV6emxlTGVuZFNDAgZzdXBwbHkFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUEdW5pdAUXZmlyc3RTd2FwcGVkQW1vdW50VmFsdWUFA25pbAMJAAACBRlmaXJzdERlcG9zaXRlZFdhdmVzQW1vdW50BRlmaXJzdERlcG9zaXRlZFdhdmVzQW1vdW50BA5saXN0UGVyY2VudGFnZQkAzAgCAPCiBAkAzAgCAOj+AgUDbmlsCgEKcmVwZWF0RnVuYwIFYWNjdW0EbmV4dAQMYm9ycm93ZWRVc2RuCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDHB1enpsZUxlbmRTQwIGYm9ycm93CQDMCAIFDnVzZG5BZGRyZXNzU3RyCQDMCAIJAGkCCQBoAgUNZmlyc3RBbW91bnRJbgUFYWNjdW0AoI0GBQNuaWwFA25pbAMJAAACBQxib3Jyb3dlZFVzZG4FDGJvcnJvd2VkVXNkbgQNc3dhcHBlZEFtb3VudAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBRBmYWtlUHV6emxlU3dhcFNDAgtzd2FwVG9XYXZlcwkAzAgCCQClCAEIBQFpBmNhbGxlcgkAzAgCCQBpAgkAaAIFF2ZpcnN0U3dhcHBlZEFtb3VudFZhbHVlBQVhY2N1bQCgjQYFA25pbAUDbmlsAwkAAAIFDXN3YXBwZWRBbW91bnQFDXN3YXBwZWRBbW91bnQEByRtYXRjaDEFDXN3YXBwZWRBbW91bnQDCQABAgUHJG1hdGNoMQIDSW50BBJzd2FwcGVkQW1vdW50VmFsdWUFByRtYXRjaDEFDXN3YXBwZWRBbW91bnQJAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQDcmVzCgACJGwFDmxpc3RQZXJjZW50YWdlCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpyZXBlYXRGdW5jAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyAyCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgkAzAgCCQEMSW50ZWdlckVudHJ5AgINc3dhcHBlZEFtb3VudAUDcmVzBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZyZWRlZW0BC3dhdmVzQW1vdW50BAt1c2VyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEEnJlZGVlbWVkVVNETkFtb3VudAkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBRBmYWtlUHV6emxlU3dhcFNDAgpzd2FwVG9VU0ROCQDMCAIFC3dhdmVzQW1vdW50CQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA25pbAMJAAACBRJyZWRlZW1lZFVTRE5BbW91bnQFEnJlZGVlbWVkVVNETkFtb3VudAQHJG1hdGNoMAUScmVkZWVtZWRVU0ROQW1vdW50AwkAAQIFByRtYXRjaDACA0ludAQTcmVkZWVtZWRBbW91bnRWYWx1ZQUHJG1hdGNoMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQt1c2VyQWRkcmVzcwIJX3JlZGVlbWVkBRNyZWRlZW1lZEFtb3VudFZhbHVlBQNuaWwJAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnv6T6o", "height": 2748402, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6VKsnbJrceeB8qzJX7Z89iYiNmaPEyxzPZTzwmmtCcRE Next: B93cARPkeeXSZtSageXKi5C4AL1mZAMEJzECaQUhpt4F Diff:
OldNewDifferences
106106 if ((swappedAmount == swappedAmount))
107107 then match swappedAmount {
108108 case swappedAmountValue: Int =>
109- let depositedWaves = invoke(addressFromStringValue(puzzleLendSC), "supply", nil, [AttachedPayment(unit, swappedAmountValue)])
110- if ((depositedWaves == depositedWaves))
111- then (((firstSwappedAmountValue * accum) / 100000) + ((firstSwappedAmountValue * accum) / 100000))
112- else throw("Strict value is not equal to itself.")
109+ swappedAmount
113110 case _ =>
114111 throw("Incorrect invoke result")
115112 }
132129
133130 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
134131 }
135-[ScriptTransfer(i.caller, res, waves2LTokenId)]
132+[IntegerEntry("swappedAmount", res)]
136133 }
137134 else throw("Strict value is not equal to itself.")
138135 case _ =>
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let usdnId = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
55
66 let waves2LTokenId = base58'GQ9QNVLGfYSbNZ4dS8NRyvGGELZL4sWPKiVj88CV1rJL'
77
88 let puzzleLendSC = "3N3DnVffnUyZtz2MRbk5U7giN112WempMNd"
99
1010 let fakePuzzleSwapSC = "3Ms8fqbXM4RhmM6CPTr44hUwHe2CCmVCfVA"
1111
1212 let usdnAddressStr = "25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT"
1313
1414 let waves2LTokenStr = "GQ9QNVLGfYSbNZ4dS8NRyvGGELZL4sWPKiVj88CV1rJL"
1515
1616 func tryGetInteger (key) = match getInteger(this, key) {
1717 case b: Int =>
1818 b
1919 case _ =>
2020 0
2121 }
2222
2323
2424 @Callable(i)
2525 func mintLong2 () = if (if ((size(i.payments) != 1))
2626 then true
2727 else (i.payments[0].amount == 0))
2828 then throw("1 payment has to be attached mint")
2929 else {
3030 let firstAmountIn = i.payments[0].amount
3131 let callerId = toString(i.caller)
3232 let firstSwappedWavesAmount = invoke(addressFromStringValue(fakePuzzleSwapSC), "swapToWaves", [toString(i.caller), firstAmountIn], nil)
3333 if ((firstSwappedWavesAmount == firstSwappedWavesAmount))
3434 then match firstSwappedWavesAmount {
3535 case firstSwappedAmountValue: Int =>
3636 let firstDepositedWavesAmount = invoke(addressFromStringValue(puzzleLendSC), "supply", nil, [AttachedPayment(unit, firstSwappedAmountValue)])
3737 if ((firstDepositedWavesAmount == firstDepositedWavesAmount))
3838 then {
3939 let listPercentage = [70000, 49000, 34300, 24010, 16807]
4040 func repeatFunc (accum,next) = {
4141 let borrowedUsdn = invoke(addressFromStringValue(puzzleLendSC), "borrow", [usdnAddressStr, ((firstAmountIn * accum) / 100000)], nil)
4242 if ((borrowedUsdn == borrowedUsdn))
4343 then {
4444 let swappedAmount = invoke(addressFromStringValue(fakePuzzleSwapSC), "swapToWaves", [toString(i.caller), ((firstSwappedAmountValue * accum) / 100000)], nil)
4545 if ((swappedAmount == swappedAmount))
4646 then match swappedAmount {
4747 case swappedAmountValue: Int =>
4848 let depositedWaves = invoke(addressFromStringValue(puzzleLendSC), "supply", nil, [AttachedPayment(unit, swappedAmountValue)])
4949 if ((depositedWaves == depositedWaves))
5050 then (((firstSwappedAmountValue * accum) / 100000) + ((firstSwappedAmountValue * next) / 100000))
5151 else throw("Strict value is not equal to itself.")
5252 case _ =>
5353 throw("Incorrect invoke result")
5454 }
5555 else throw("Strict value is not equal to itself.")
5656 }
5757 else throw("Strict value is not equal to itself.")
5858 }
5959
6060 let res = {
6161 let $l = listPercentage
6262 let $s = size($l)
6363 let $acc0 = 0
6464 func $f0_1 ($a,$i) = if (($i >= $s))
6565 then $a
6666 else repeatFunc($a, $l[$i])
6767
6868 func $f0_2 ($a,$i) = if (($i >= $s))
6969 then $a
7070 else throw("List size exceeds 5")
7171
7272 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
7373 }
7474 [ScriptTransfer(i.caller, res, waves2LTokenId)]
7575 }
7676 else throw("Strict value is not equal to itself.")
7777 case _ =>
7878 throw("Incorrect invoke result")
7979 }
8080 else throw("Strict value is not equal to itself.")
8181 }
8282
8383
8484
8585 @Callable(i)
8686 func mintLong2_test () = if (if ((size(i.payments) != 1))
8787 then true
8888 else (i.payments[0].amount == 0))
8989 then throw("1 payment has to be attached mint")
9090 else {
9191 let firstAmountIn = i.payments[0].amount
9292 let callerId = toString(i.caller)
9393 let firstSwappedWavesAmount = invoke(addressFromStringValue(fakePuzzleSwapSC), "swapToWaves", [toString(i.caller), firstAmountIn], nil)
9494 if ((firstSwappedWavesAmount == firstSwappedWavesAmount))
9595 then match firstSwappedWavesAmount {
9696 case firstSwappedAmountValue: Int =>
9797 let firstDepositedWavesAmount = invoke(addressFromStringValue(puzzleLendSC), "supply", nil, [AttachedPayment(unit, firstSwappedAmountValue)])
9898 if ((firstDepositedWavesAmount == firstDepositedWavesAmount))
9999 then {
100100 let listPercentage = [70000, 49000]
101101 func repeatFunc (accum,next) = {
102102 let borrowedUsdn = invoke(addressFromStringValue(puzzleLendSC), "borrow", [usdnAddressStr, ((firstAmountIn * accum) / 100000)], nil)
103103 if ((borrowedUsdn == borrowedUsdn))
104104 then {
105105 let swappedAmount = invoke(addressFromStringValue(fakePuzzleSwapSC), "swapToWaves", [toString(i.caller), ((firstSwappedAmountValue * accum) / 100000)], nil)
106106 if ((swappedAmount == swappedAmount))
107107 then match swappedAmount {
108108 case swappedAmountValue: Int =>
109- let depositedWaves = invoke(addressFromStringValue(puzzleLendSC), "supply", nil, [AttachedPayment(unit, swappedAmountValue)])
110- if ((depositedWaves == depositedWaves))
111- then (((firstSwappedAmountValue * accum) / 100000) + ((firstSwappedAmountValue * accum) / 100000))
112- else throw("Strict value is not equal to itself.")
109+ swappedAmount
113110 case _ =>
114111 throw("Incorrect invoke result")
115112 }
116113 else throw("Strict value is not equal to itself.")
117114 }
118115 else throw("Strict value is not equal to itself.")
119116 }
120117
121118 let res = {
122119 let $l = listPercentage
123120 let $s = size($l)
124121 let $acc0 = 0
125122 func $f0_1 ($a,$i) = if (($i >= $s))
126123 then $a
127124 else repeatFunc($a, $l[$i])
128125
129126 func $f0_2 ($a,$i) = if (($i >= $s))
130127 then $a
131128 else throw("List size exceeds 2")
132129
133130 $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
134131 }
135-[ScriptTransfer(i.caller, res, waves2LTokenId)]
132+[IntegerEntry("swappedAmount", res)]
136133 }
137134 else throw("Strict value is not equal to itself.")
138135 case _ =>
139136 throw("Incorrect invoke result")
140137 }
141138 else throw("Strict value is not equal to itself.")
142139 }
143140
144141
145142
146143 @Callable(i)
147144 func redeem (wavesAmount) = {
148145 let userAddress = toString(i.caller)
149146 let redeemedUSDNAmount = invoke(addressFromStringValue(fakePuzzleSwapSC), "swapToUSDN", [wavesAmount, userAddress], nil)
150147 if ((redeemedUSDNAmount == redeemedUSDNAmount))
151148 then match redeemedUSDNAmount {
152149 case redeemedAmountValue: Int =>
153150 [IntegerEntry((userAddress + "_redeemed"), redeemedAmountValue)]
154151 case _ =>
155152 throw("Incorrect invoke result")
156153 }
157154 else throw("Strict value is not equal to itself.")
158155 }
159156
160157
161158 @Verifier(tx)
162159 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
163160

github/deemru/w8io/169f3d6 
38.93 ms