tx · Ac6tZh5nwwwEKzofT4sNbKXcWESWuiCXkHkHoxwKSxDr 3PG7CHvBatHpChwm8reH74wfEwk1PHc8Rqy: -0.00300000 Waves 2022.12.06 13:43 [3413860] smart account 3PG7CHvBatHpChwm8reH74wfEwk1PHc8Rqy > SELF 0.00000000 Waves
{ "type": 13, "id": "Ac6tZh5nwwwEKzofT4sNbKXcWESWuiCXkHkHoxwKSxDr", "fee": 300000, "feeAssetId": null, "timestamp": 1670323429807, "version": 2, "chainId": 87, "sender": "3PG7CHvBatHpChwm8reH74wfEwk1PHc8Rqy", "senderPublicKey": "9KXfR1iJDN9MLTf7rgrygpRA3HG53KCgWyxzqk4m25Qd", "proofs": [ "5cZiyGu1fHaWadKVWvmFHifWpsuFUAZqo4VU7z1A4djqRpGozL2nJpr1s1As5L1u1MKum9qVPcQPBKLABQZ7G8aT" ], "script": "base64:BgIGCAISABIACAAZV1hfTFBfV0FWRVNfVVNETl9BU1NFVF9JRAEgXedtbkamxzmxtK4hQ1NqaJeqmQ+fWxX6vGpRDRxJGSAAF1dYX1BPT0xfV0FWRVNfVVNETl9EQVBQCQEHQWRkcmVzcwEBGgFX7UefzUI8k75LIc37An4fyC37loB6w699ABtORVVUUklOT19SRVNUX1JFQURPTkxZX0RBUFAJAQdBZGRyZXNzAQEaAVc2mMwFV8eubgPH9X8mVUOITa4f15p3UlEAFU5FVVRSSU5PX01FVFJJQ1NfREFQUAkBB0FkZHJlc3MBARoBVzjkpo76YXsJPSIs33Rbs+CIsp0VDzoUtgANVVNETl9BU1NFVF9JRAEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEBCWFzQW55TGlzdAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAglMaXN0W0FueV0EAWwFByRtYXRjaDAFAWwJAAIBAgQjZXJyAQVhc0ludAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgQjZXJyAQVhc1N0cgEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXgFByRtYXRjaDAFAXgEAXQFByRtYXRjaDAJAAIBAgQjZXJyAgFpAQdkZWZhdWx0AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC05vdCBhbGxvd2VkAwMJAQEhAQkBCWlzRGVmaW5lZAEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAYJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAUNVVNETl9BU1NFVF9JRAkAAgECCVVTRE4gT25seQQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQPbmV1dHJpbm9NZXRyaWNzCQEJYXNBbnlMaXN0AQkA/AcEBRVORVVUUklOT19NRVRSSUNTX0RBUFACGmNhbGNOZXV0aW5vTWV0cmljc1JFQURPTkxZBQNuaWwFA25pbAMJAAACBQ9uZXV0cmlub01ldHJpY3MFD25ldXRyaW5vTWV0cmljcwQCQlIJAQVhc0ludAEJAJEDAgUPbmV1dHJpbm9NZXRyaWNzAAgDCQBmAgUCQlIAzI8GBARjYWxsCQEFYXNTdHIBCQD8BwQFG05FVVRSSU5PX1JFU1RfUkVBRE9OTFlfREFQUAIQc3dhcEluZm9SRUFET05MWQkAzAgCBQR0aGlzBQNuaWwFA25pbAMJAAACBQRjYWxsBQRjYWxsBBFuZXV0cmlub19kYXRhX2FycgkAtQkCBQRjYWxsAgJfXwQYYWxyZWFkeVN3YXBwZWRVbmRlckxpbWl0CQEFYXNJbnQBCQCRAwIFEW5ldXRyaW5vX2RhdGFfYXJyAAsEFW1heEF2YWlsYWJsZVRvU3dhcE5vdwkBBWFzSW50AQkAkQMCBRFuZXV0cmlub19kYXRhX2FycgAKAwkBAiE9AgUYYWxyZWFkeVN3YXBwZWRVbmRlckxpbWl0AAAJAAIBAg5DYW4ndCBzd2FwIHlldAQRYW1vdW5PZlVzZG5Ub1N3YXADCQBmAgUGYW1vdW50BRVtYXhBdmFpbGFibGVUb1N3YXBOb3cFFW1heEF2YWlsYWJsZVRvU3dhcE5vdwUGYW1vdW50BBJzd2FwVXNkblRvV2F2ZXNfU0MJAPwHBAkBB0FkZHJlc3MBARoBVyDCi2Z2rMPA457xP8NFWRqjYj6l2pd0igITc3dhcE5ldXRyaW5vVG9XYXZlcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQ1VU0ROX0FTU0VUX0lEBRFhbW91bk9mVXNkblRvU3dhcAUDbmlsAwkAAAIFEnN3YXBVc2RuVG9XYXZlc19TQwUSc3dhcFVzZG5Ub1dhdmVzX1NDBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAgtCciB1bmRlciAxMAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQp3YXZlc1RvVWRuAAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECC05vdCBhbGxvd2VkAwkBCWlzRGVmaW5lZAEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAkAAgECCldBVkVTIE9ubHkEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEBWNhbGwxCQD8BwQFF1dYX1BPT0xfV0FWRVNfVVNETl9EQVBQAglwdXRPbmVUa24JAMwIAgABCQDMCAIHBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFBHVuaXQFBmFtb3VudAUDbmlsAwkAAAIFBWNhbGwxBQVjYWxsMQQObHBUb2tlbkJhbGFuY2UJAPAHAgUEdGhpcwUZV1hfTFBfV0FWRVNfVVNETl9BU1NFVF9JRAQFY2FsbDIJAPwHBAUXV1hfUE9PTF9XQVZFU19VU0ROX0RBUFACCWdldE9uZVRrbgkAzAgCBQ1VU0ROX0FTU0VUX0lECQDMCAIAAQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBRlXWF9MUF9XQVZFU19VU0ROX0FTU0VUX0lEBQ5scFRva2VuQmFsYW5jZQUDbmlsAwkAAAIFBWNhbGwyBQVjYWxsMgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkAyBMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleZAZkLc=", "height": 3413860, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ADe1jCZq4B6xJ5CYgFSu2yRhzvFySFKXhzDH1d1d9WN4 Next: D8j8nZ1TvQRk4jZFmE1sgjhBoLUTrHLkMfNFeKx7f6Tu Diff:
Old | New | Differences | |
---|---|---|---|
38 | 38 | @Callable(i) | |
39 | 39 | func default () = if ((i.caller != this)) | |
40 | 40 | then throw("Not allowed") | |
41 | - | else if (isDefined(i.payments[0].assetId)) | |
42 | - | then throw("WAVES Only") | |
41 | + | else if (if (!(isDefined(i.payments[0].assetId))) | |
42 | + | then true | |
43 | + | else (i.payments[0].assetId != USDN_ASSET_ID)) | |
44 | + | then throw("USDN Only") | |
43 | 45 | else { | |
44 | 46 | let amount = i.payments[0].amount | |
45 | 47 | let neutrinoMetrics = asAnyList(invoke(NEUTRINO_METRICS_DAPP, "calcNeutinoMetricsREADONLY", nil, nil)) | |
46 | 48 | if ((neutrinoMetrics == neutrinoMetrics)) | |
47 | 49 | then { | |
48 | 50 | let BR = asInt(neutrinoMetrics[8]) | |
49 | - | if (true) | |
50 | - | then throw(toString(BR)) | |
51 | - | else if ((BR > 100300)) | |
52 | - | then { | |
53 | - | let call1 = invoke(WX_POOL_WAVES_USDN_DAPP, "putOneTkn", [1, false], [AttachedPayment(unit, amount)]) | |
54 | - | if ((call1 == call1)) | |
55 | - | then { | |
56 | - | let lpTokenBalance = assetBalance(this, WX_LP_WAVES_USDN_ASSET_ID) | |
57 | - | let call2 = invoke(WX_POOL_WAVES_USDN_DAPP, "getOneTkn", [USDN_ASSET_ID, 1], [AttachedPayment(WX_LP_WAVES_USDN_ASSET_ID, lpTokenBalance)]) | |
58 | - | if ((call2 == call2)) | |
59 | - | then { | |
60 | - | let usdnTokenBalance = assetBalance(this, USDN_ASSET_ID) | |
61 | - | let call3 = asStr(invoke(NEUTRINO_REST_READONLY_DAPP, "swapInfoREADONLY", [this], nil)) | |
62 | - | if ((call3 == call3)) | |
63 | - | then { | |
64 | - | let neutrino_data_arr = split(call3, "__") | |
65 | - | let alreadySwappedUnderLimit = asInt(neutrino_data_arr[11]) | |
66 | - | let maxAvailableToSwapNow = asInt(neutrino_data_arr[10]) | |
67 | - | if ((alreadySwappedUnderLimit != 0)) | |
68 | - | then throw("Can't swap yet") | |
69 | - | else { | |
70 | - | let amounOfUsdnToSwap = if ((usdnTokenBalance > maxAvailableToSwapNow)) | |
71 | - | then maxAvailableToSwapNow | |
72 | - | else usdnTokenBalance | |
73 | - | let swapUsdnToWaves_SC = invoke(Address(base58'3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj'), "swapNeutrinoToWaves", nil, [AttachedPayment(USDN_ASSET_ID, amounOfUsdnToSwap)]) | |
74 | - | if ((swapUsdnToWaves_SC == swapUsdnToWaves_SC)) | |
75 | - | then nil | |
76 | - | else throw("Strict value is not equal to itself.") | |
77 | - | } | |
78 | - | } | |
79 | - | else throw("Strict value is not equal to itself.") | |
80 | - | } | |
81 | - | else throw("Strict value is not equal to itself.") | |
82 | - | } | |
83 | - | else throw("Strict value is not equal to itself.") | |
84 | - | } | |
85 | - | else throw("Br under 10") | |
51 | + | if ((BR > 100300)) | |
52 | + | then { | |
53 | + | let call = asStr(invoke(NEUTRINO_REST_READONLY_DAPP, "swapInfoREADONLY", [this], nil)) | |
54 | + | if ((call == call)) | |
55 | + | then { | |
56 | + | let neutrino_data_arr = split(call, "__") | |
57 | + | let alreadySwappedUnderLimit = asInt(neutrino_data_arr[11]) | |
58 | + | let maxAvailableToSwapNow = asInt(neutrino_data_arr[10]) | |
59 | + | if ((alreadySwappedUnderLimit != 0)) | |
60 | + | then throw("Can't swap yet") | |
61 | + | else { | |
62 | + | let amounOfUsdnToSwap = if ((amount > maxAvailableToSwapNow)) | |
63 | + | then maxAvailableToSwapNow | |
64 | + | else amount | |
65 | + | let swapUsdnToWaves_SC = invoke(Address(base58'3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj'), "swapNeutrinoToWaves", nil, [AttachedPayment(USDN_ASSET_ID, amounOfUsdnToSwap)]) | |
66 | + | if ((swapUsdnToWaves_SC == swapUsdnToWaves_SC)) | |
67 | + | then nil | |
68 | + | else throw("Strict value is not equal to itself.") | |
69 | + | } | |
70 | + | } | |
71 | + | else throw("Strict value is not equal to itself.") | |
72 | + | } | |
73 | + | else throw("Br under 10") | |
86 | 74 | } | |
87 | 75 | else throw("Strict value is not equal to itself.") | |
88 | 76 | } | |
90 | 78 | ||
91 | 79 | ||
92 | 80 | @Callable(i) | |
93 | - | func | |
81 | + | func wavesToUdn () = if ((i.caller != this)) | |
94 | 82 | then throw("Not allowed") | |
95 | - | else if (if (!(isDefined(i.payments[0].assetId))) | |
96 | - | then (i.payments[0].assetId != USDN_ASSET_ID) | |
97 | - | else false) | |
98 | - | then throw("USDN Only") | |
83 | + | else if (isDefined(i.payments[0].assetId)) | |
84 | + | then throw("WAVES Only") | |
99 | 85 | else { | |
100 | 86 | let amount = i.payments[0].amount | |
101 | - | let call1 = invoke(WX_POOL_WAVES_USDN_DAPP, "putOneTkn", [ | |
87 | + | let call1 = invoke(WX_POOL_WAVES_USDN_DAPP, "putOneTkn", [1, false], [AttachedPayment(unit, amount)]) | |
102 | 88 | if ((call1 == call1)) | |
103 | 89 | then { | |
104 | 90 | let lpTokenBalance = assetBalance(this, WX_LP_WAVES_USDN_ASSET_ID) | |
105 | - | let call2 = invoke(WX_POOL_WAVES_USDN_DAPP, "getOneTkn", [ | |
91 | + | let call2 = invoke(WX_POOL_WAVES_USDN_DAPP, "getOneTkn", [USDN_ASSET_ID, 1], [AttachedPayment(WX_LP_WAVES_USDN_ASSET_ID, lpTokenBalance)]) | |
106 | 92 | if ((call2 == call2)) | |
107 | 93 | then nil | |
108 | 94 | else throw("Strict value is not equal to itself.") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let WX_LP_WAVES_USDN_ASSET_ID = base58'7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1' | |
5 | 5 | ||
6 | 6 | let WX_POOL_WAVES_USDN_DAPP = Address(base58'3PPZWgFNRKHLvM51pwS934C8VZ7d2F4Z58g') | |
7 | 7 | ||
8 | 8 | let NEUTRINO_REST_READONLY_DAPP = Address(base58'3P6uaG88jjcLYZQrvJHLWPbFFRnChnAzmcU') | |
9 | 9 | ||
10 | 10 | let NEUTRINO_METRICS_DAPP = Address(base58'3P77iUusNwMMzWFdC8f7bftwpHyG1PBs1gq') | |
11 | 11 | ||
12 | 12 | let USDN_ASSET_ID = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p' | |
13 | 13 | ||
14 | 14 | func asAnyList (v) = match v { | |
15 | 15 | case l: List[Any] => | |
16 | 16 | l | |
17 | 17 | case _ => | |
18 | 18 | throw("#err") | |
19 | 19 | } | |
20 | 20 | ||
21 | 21 | ||
22 | 22 | func asInt (v) = match v { | |
23 | 23 | case x: Int => | |
24 | 24 | x | |
25 | 25 | case t => | |
26 | 26 | throw("#err") | |
27 | 27 | } | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func asStr (v) = match v { | |
31 | 31 | case x: String => | |
32 | 32 | x | |
33 | 33 | case t => | |
34 | 34 | throw("#err") | |
35 | 35 | } | |
36 | 36 | ||
37 | 37 | ||
38 | 38 | @Callable(i) | |
39 | 39 | func default () = if ((i.caller != this)) | |
40 | 40 | then throw("Not allowed") | |
41 | - | else if (isDefined(i.payments[0].assetId)) | |
42 | - | then throw("WAVES Only") | |
41 | + | else if (if (!(isDefined(i.payments[0].assetId))) | |
42 | + | then true | |
43 | + | else (i.payments[0].assetId != USDN_ASSET_ID)) | |
44 | + | then throw("USDN Only") | |
43 | 45 | else { | |
44 | 46 | let amount = i.payments[0].amount | |
45 | 47 | let neutrinoMetrics = asAnyList(invoke(NEUTRINO_METRICS_DAPP, "calcNeutinoMetricsREADONLY", nil, nil)) | |
46 | 48 | if ((neutrinoMetrics == neutrinoMetrics)) | |
47 | 49 | then { | |
48 | 50 | let BR = asInt(neutrinoMetrics[8]) | |
49 | - | if (true) | |
50 | - | then throw(toString(BR)) | |
51 | - | else if ((BR > 100300)) | |
52 | - | then { | |
53 | - | let call1 = invoke(WX_POOL_WAVES_USDN_DAPP, "putOneTkn", [1, false], [AttachedPayment(unit, amount)]) | |
54 | - | if ((call1 == call1)) | |
55 | - | then { | |
56 | - | let lpTokenBalance = assetBalance(this, WX_LP_WAVES_USDN_ASSET_ID) | |
57 | - | let call2 = invoke(WX_POOL_WAVES_USDN_DAPP, "getOneTkn", [USDN_ASSET_ID, 1], [AttachedPayment(WX_LP_WAVES_USDN_ASSET_ID, lpTokenBalance)]) | |
58 | - | if ((call2 == call2)) | |
59 | - | then { | |
60 | - | let usdnTokenBalance = assetBalance(this, USDN_ASSET_ID) | |
61 | - | let call3 = asStr(invoke(NEUTRINO_REST_READONLY_DAPP, "swapInfoREADONLY", [this], nil)) | |
62 | - | if ((call3 == call3)) | |
63 | - | then { | |
64 | - | let neutrino_data_arr = split(call3, "__") | |
65 | - | let alreadySwappedUnderLimit = asInt(neutrino_data_arr[11]) | |
66 | - | let maxAvailableToSwapNow = asInt(neutrino_data_arr[10]) | |
67 | - | if ((alreadySwappedUnderLimit != 0)) | |
68 | - | then throw("Can't swap yet") | |
69 | - | else { | |
70 | - | let amounOfUsdnToSwap = if ((usdnTokenBalance > maxAvailableToSwapNow)) | |
71 | - | then maxAvailableToSwapNow | |
72 | - | else usdnTokenBalance | |
73 | - | let swapUsdnToWaves_SC = invoke(Address(base58'3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj'), "swapNeutrinoToWaves", nil, [AttachedPayment(USDN_ASSET_ID, amounOfUsdnToSwap)]) | |
74 | - | if ((swapUsdnToWaves_SC == swapUsdnToWaves_SC)) | |
75 | - | then nil | |
76 | - | else throw("Strict value is not equal to itself.") | |
77 | - | } | |
78 | - | } | |
79 | - | else throw("Strict value is not equal to itself.") | |
80 | - | } | |
81 | - | else throw("Strict value is not equal to itself.") | |
82 | - | } | |
83 | - | else throw("Strict value is not equal to itself.") | |
84 | - | } | |
85 | - | else throw("Br under 10") | |
51 | + | if ((BR > 100300)) | |
52 | + | then { | |
53 | + | let call = asStr(invoke(NEUTRINO_REST_READONLY_DAPP, "swapInfoREADONLY", [this], nil)) | |
54 | + | if ((call == call)) | |
55 | + | then { | |
56 | + | let neutrino_data_arr = split(call, "__") | |
57 | + | let alreadySwappedUnderLimit = asInt(neutrino_data_arr[11]) | |
58 | + | let maxAvailableToSwapNow = asInt(neutrino_data_arr[10]) | |
59 | + | if ((alreadySwappedUnderLimit != 0)) | |
60 | + | then throw("Can't swap yet") | |
61 | + | else { | |
62 | + | let amounOfUsdnToSwap = if ((amount > maxAvailableToSwapNow)) | |
63 | + | then maxAvailableToSwapNow | |
64 | + | else amount | |
65 | + | let swapUsdnToWaves_SC = invoke(Address(base58'3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj'), "swapNeutrinoToWaves", nil, [AttachedPayment(USDN_ASSET_ID, amounOfUsdnToSwap)]) | |
66 | + | if ((swapUsdnToWaves_SC == swapUsdnToWaves_SC)) | |
67 | + | then nil | |
68 | + | else throw("Strict value is not equal to itself.") | |
69 | + | } | |
70 | + | } | |
71 | + | else throw("Strict value is not equal to itself.") | |
72 | + | } | |
73 | + | else throw("Br under 10") | |
86 | 74 | } | |
87 | 75 | else throw("Strict value is not equal to itself.") | |
88 | 76 | } | |
89 | 77 | ||
90 | 78 | ||
91 | 79 | ||
92 | 80 | @Callable(i) | |
93 | - | func | |
81 | + | func wavesToUdn () = if ((i.caller != this)) | |
94 | 82 | then throw("Not allowed") | |
95 | - | else if (if (!(isDefined(i.payments[0].assetId))) | |
96 | - | then (i.payments[0].assetId != USDN_ASSET_ID) | |
97 | - | else false) | |
98 | - | then throw("USDN Only") | |
83 | + | else if (isDefined(i.payments[0].assetId)) | |
84 | + | then throw("WAVES Only") | |
99 | 85 | else { | |
100 | 86 | let amount = i.payments[0].amount | |
101 | - | let call1 = invoke(WX_POOL_WAVES_USDN_DAPP, "putOneTkn", [ | |
87 | + | let call1 = invoke(WX_POOL_WAVES_USDN_DAPP, "putOneTkn", [1, false], [AttachedPayment(unit, amount)]) | |
102 | 88 | if ((call1 == call1)) | |
103 | 89 | then { | |
104 | 90 | let lpTokenBalance = assetBalance(this, WX_LP_WAVES_USDN_ASSET_ID) | |
105 | - | let call2 = invoke(WX_POOL_WAVES_USDN_DAPP, "getOneTkn", [ | |
91 | + | let call2 = invoke(WX_POOL_WAVES_USDN_DAPP, "getOneTkn", [USDN_ASSET_ID, 1], [AttachedPayment(WX_LP_WAVES_USDN_ASSET_ID, lpTokenBalance)]) | |
106 | 92 | if ((call2 == call2)) | |
107 | 93 | then nil | |
108 | 94 | else throw("Strict value is not equal to itself.") | |
109 | 95 | } | |
110 | 96 | else throw("Strict value is not equal to itself.") | |
111 | 97 | } | |
112 | 98 | ||
113 | 99 | ||
114 | 100 | @Verifier(tx) | |
115 | 101 | func verify () = sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
116 | 102 |
github/deemru/w8io/3ef1775 33.43 ms ◑