initial ws server with lookupToken
This commit is contained in:
42
abi.js
Normal file
42
abi.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
export const erc20Abi = [
|
||||||
|
'function name() view returns (string)',
|
||||||
|
'function symbol() view returns (string)',
|
||||||
|
'function decimals() view returns (uint8)',
|
||||||
|
'function totalSupply() view returns (uint256)',
|
||||||
|
'function balanceOf(address) view returns (uint256)',
|
||||||
|
'function transfer(address,uint256) returns (bool)',
|
||||||
|
'function transferFrom(address,address,uint256) returns (bool)',
|
||||||
|
'function approve(address,uint256) returns (bool success)',
|
||||||
|
'function allowance(address,address) view returns (uint256)',
|
||||||
|
'event Transfer(address indexed,address indexed,uint256)',
|
||||||
|
'event Approval(address indexed,address indexed,uint256)',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
const TimedOrderSpec = '(' +
|
||||||
|
'address tokenIn,' +
|
||||||
|
'address tokenOut,' +
|
||||||
|
'uint24 fee,' +
|
||||||
|
'uint32 deadline,' +
|
||||||
|
'uint32 leeway,' +
|
||||||
|
'uint160 minSqrtPriceX96,' +
|
||||||
|
'uint160 maxSqrtPriceX96,' +
|
||||||
|
'uint8 numTranches,' +
|
||||||
|
'uint256 amount,' +
|
||||||
|
'bool amountIsInput' +
|
||||||
|
')'
|
||||||
|
|
||||||
|
export const timedOrderAbi = [
|
||||||
|
'event TimedOrderCreated (address owner, uint64 index, Spec spec)',
|
||||||
|
'event TimedOrderFilled (address owner, uint64 index, uint256 amountIn, uint256 amountOut)',
|
||||||
|
'event TimedOrderCompleted (address owner, uint64 index)',
|
||||||
|
'event TimedOrderError (address owner, uint64 index, string reason)',
|
||||||
|
`timedOrder(${TimedOrderSpec}) returns (uint64 index)`,
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
export const abi = {
|
||||||
|
'ERC20': erc20Abi,
|
||||||
|
'TimedOrder': timedOrderAbi,
|
||||||
|
}
|
||||||
|
|
||||||
21
blockchain.js
Normal file
21
blockchain.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import {ethers} from "ethers";
|
||||||
|
|
||||||
|
const providers = {} // indexed by chain id
|
||||||
|
|
||||||
|
|
||||||
|
export function provider(chainId) {
|
||||||
|
let result = providers[chainId]
|
||||||
|
if( result === undefined ) {
|
||||||
|
const rpc_url = process.env['DEXORDER_RPC_URL_'+chainId]
|
||||||
|
if( rpc_url === undefined ) {
|
||||||
|
console.error('No provider found for chainId',chainId)
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
result = rpc_url.startsWith('ws') ?
|
||||||
|
new ethers.WebSocketProvider(rpc_url, chainId) :
|
||||||
|
new ethers.JsonRpcProvider(rpc_url, chainId)
|
||||||
|
providers[chainId] = result
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
25
main.js
Normal file
25
main.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import 'dotenv/config'
|
||||||
|
|
||||||
|
import { createServer } from "http";
|
||||||
|
import { Server } from "socket.io"
|
||||||
|
import {lookupToken} from "./token.js";
|
||||||
|
|
||||||
|
const options = {}
|
||||||
|
if( process.env.DEXORDER_CORS )
|
||||||
|
options['cors'] = {origin:process.env.DEXORDER_CORS}
|
||||||
|
const httpServer = createServer()
|
||||||
|
const io = new Server(httpServer, options)
|
||||||
|
|
||||||
|
io.on("connection", (socket) => {
|
||||||
|
// initially, only anonymous messages are allowed
|
||||||
|
socket.on('lookupToken', (chainId, address, callback) => {
|
||||||
|
lookupToken(chainId, address).then((result)=>callback(result)).catch(()=>callback(null))
|
||||||
|
})
|
||||||
|
// todo send known tokens or other initial config
|
||||||
|
socket.emit('welcome', {})
|
||||||
|
});
|
||||||
|
|
||||||
|
const port = parseInt(process.env.DEXORDER_PORT) || 3000;
|
||||||
|
httpServer.listen(port)
|
||||||
|
console.log('Started server on port '+port)
|
||||||
|
console.log(options)
|
||||||
18
package.json
Normal file
18
package.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "server",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "main.js",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"node": "node main.js"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "unlicensed",
|
||||||
|
"dependencies": {
|
||||||
|
"dotenv": "^16.3.1",
|
||||||
|
"ethers": "^6.7.1",
|
||||||
|
"socket.io": "^4.7.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
36
token.js
Normal file
36
token.js
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
// keeps a list of known tokens
|
||||||
|
|
||||||
|
// todo load standard known tokens
|
||||||
|
|
||||||
|
import {ethers} from "ethers";
|
||||||
|
import {erc20Abi} from "./abi.js";
|
||||||
|
import {provider} from "./blockchain.js";
|
||||||
|
|
||||||
|
const tokens = {
|
||||||
|
42161: {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function lookupToken(chainId, address) {
|
||||||
|
console.log('lookupToken', chainId, address)
|
||||||
|
const chainTokens = tokens[chainId]
|
||||||
|
if( chainTokens === undefined )
|
||||||
|
return null
|
||||||
|
try {
|
||||||
|
let result = chainTokens[address]
|
||||||
|
console.log('found', result)
|
||||||
|
if (result === undefined) {
|
||||||
|
// todo look in tokens project
|
||||||
|
const addr = ethers.getAddress(address)
|
||||||
|
console.log('addr', addr)
|
||||||
|
const token = new ethers.Contract(addr, erc20Abi, provider(chainId))
|
||||||
|
const symbol = await token.symbol()
|
||||||
|
console.log('symbol', symbol)
|
||||||
|
const decimals = Number(await token.decimals())
|
||||||
|
result = {name: `${symbol} (${addr})`, symbol, decimals, address: addr}
|
||||||
|
chainTokens[addr] = result
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
197
yarn.lock
Normal file
197
yarn.lock
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@adraffy/ens-normalize@1.9.2":
|
||||||
|
version "1.9.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz#60111a5d9db45b2e5cbb6231b0bb8d97e8659316"
|
||||||
|
integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==
|
||||||
|
|
||||||
|
"@noble/hashes@1.1.2":
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183"
|
||||||
|
integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==
|
||||||
|
|
||||||
|
"@noble/secp256k1@1.7.1":
|
||||||
|
version "1.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c"
|
||||||
|
integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==
|
||||||
|
|
||||||
|
"@socket.io/component-emitter@~3.1.0":
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553"
|
||||||
|
integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==
|
||||||
|
|
||||||
|
"@types/cookie@^0.4.1":
|
||||||
|
version "0.4.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d"
|
||||||
|
integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==
|
||||||
|
|
||||||
|
"@types/cors@^2.8.12":
|
||||||
|
version "2.8.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94"
|
||||||
|
integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/node@*", "@types/node@>=10.0.0":
|
||||||
|
version "20.5.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377"
|
||||||
|
integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==
|
||||||
|
|
||||||
|
"@types/node@18.15.13":
|
||||||
|
version "18.15.13"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469"
|
||||||
|
integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==
|
||||||
|
|
||||||
|
accepts@~1.3.4:
|
||||||
|
version "1.3.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
|
||||||
|
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
|
||||||
|
dependencies:
|
||||||
|
mime-types "~2.1.34"
|
||||||
|
negotiator "0.6.3"
|
||||||
|
|
||||||
|
aes-js@4.0.0-beta.5:
|
||||||
|
version "4.0.0-beta.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873"
|
||||||
|
integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==
|
||||||
|
|
||||||
|
base64id@2.0.0, base64id@~2.0.0:
|
||||||
|
version "2.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
|
||||||
|
integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
|
||||||
|
|
||||||
|
cookie@~0.4.1:
|
||||||
|
version "0.4.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
|
||||||
|
integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
|
||||||
|
|
||||||
|
cors@~2.8.5:
|
||||||
|
version "2.8.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
|
||||||
|
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
|
||||||
|
dependencies:
|
||||||
|
object-assign "^4"
|
||||||
|
vary "^1"
|
||||||
|
|
||||||
|
debug@~4.3.1, debug@~4.3.2:
|
||||||
|
version "4.3.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
|
||||||
|
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
|
||||||
|
dependencies:
|
||||||
|
ms "2.1.2"
|
||||||
|
|
||||||
|
dotenv@^16.3.1:
|
||||||
|
version "16.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e"
|
||||||
|
integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==
|
||||||
|
|
||||||
|
engine.io-parser@~5.2.1:
|
||||||
|
version "5.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb"
|
||||||
|
integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==
|
||||||
|
|
||||||
|
engine.io@~6.5.2:
|
||||||
|
version "6.5.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c"
|
||||||
|
integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA==
|
||||||
|
dependencies:
|
||||||
|
"@types/cookie" "^0.4.1"
|
||||||
|
"@types/cors" "^2.8.12"
|
||||||
|
"@types/node" ">=10.0.0"
|
||||||
|
accepts "~1.3.4"
|
||||||
|
base64id "2.0.0"
|
||||||
|
cookie "~0.4.1"
|
||||||
|
cors "~2.8.5"
|
||||||
|
debug "~4.3.1"
|
||||||
|
engine.io-parser "~5.2.1"
|
||||||
|
ws "~8.11.0"
|
||||||
|
|
||||||
|
ethers@^6.7.1:
|
||||||
|
version "6.7.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.7.1.tgz#9c65e8b5d8e9ad77b7e8cf1c46099892cfafad49"
|
||||||
|
integrity sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==
|
||||||
|
dependencies:
|
||||||
|
"@adraffy/ens-normalize" "1.9.2"
|
||||||
|
"@noble/hashes" "1.1.2"
|
||||||
|
"@noble/secp256k1" "1.7.1"
|
||||||
|
"@types/node" "18.15.13"
|
||||||
|
aes-js "4.0.0-beta.5"
|
||||||
|
tslib "2.4.0"
|
||||||
|
ws "8.5.0"
|
||||||
|
|
||||||
|
mime-db@1.52.0:
|
||||||
|
version "1.52.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
||||||
|
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
||||||
|
|
||||||
|
mime-types@~2.1.34:
|
||||||
|
version "2.1.35"
|
||||||
|
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
||||||
|
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
|
||||||
|
dependencies:
|
||||||
|
mime-db "1.52.0"
|
||||||
|
|
||||||
|
ms@2.1.2:
|
||||||
|
version "2.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||||
|
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||||
|
|
||||||
|
negotiator@0.6.3:
|
||||||
|
version "0.6.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
|
||||||
|
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
|
||||||
|
|
||||||
|
object-assign@^4:
|
||||||
|
version "4.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||||
|
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
|
||||||
|
|
||||||
|
socket.io-adapter@~2.5.2:
|
||||||
|
version "2.5.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12"
|
||||||
|
integrity sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==
|
||||||
|
dependencies:
|
||||||
|
ws "~8.11.0"
|
||||||
|
|
||||||
|
socket.io-parser@~4.2.4:
|
||||||
|
version "4.2.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83"
|
||||||
|
integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==
|
||||||
|
dependencies:
|
||||||
|
"@socket.io/component-emitter" "~3.1.0"
|
||||||
|
debug "~4.3.1"
|
||||||
|
|
||||||
|
socket.io@^4.7.2:
|
||||||
|
version "4.7.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002"
|
||||||
|
integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==
|
||||||
|
dependencies:
|
||||||
|
accepts "~1.3.4"
|
||||||
|
base64id "~2.0.0"
|
||||||
|
cors "~2.8.5"
|
||||||
|
debug "~4.3.2"
|
||||||
|
engine.io "~6.5.2"
|
||||||
|
socket.io-adapter "~2.5.2"
|
||||||
|
socket.io-parser "~4.2.4"
|
||||||
|
|
||||||
|
tslib@2.4.0:
|
||||||
|
version "2.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
|
||||||
|
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
|
||||||
|
|
||||||
|
vary@^1:
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
||||||
|
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
|
||||||
|
|
||||||
|
ws@8.5.0:
|
||||||
|
version "8.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
|
||||||
|
integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
|
||||||
|
|
||||||
|
ws@~8.11.0:
|
||||||
|
version "8.11.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
|
||||||
|
integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
|
||||||
Reference in New Issue
Block a user