From 8e66869c612c4567037fea0b1943323b32f9049c Mon Sep 17 00:00:00 2001
From: JesseTheRobot <jesse.cruz.wright@gmail.com>
Date: Thu, 5 May 2022 09:22:43 +0000
Subject: [PATCH] cw

---
 .gitignore             |   2 +
 README.md              |   3 +-
 cw/.gitignore          |   1 +
 cw/.vscode/launch.json |  25 +++
 cw/llama.png           | Bin 0 -> 28809 bytes
 cw/package.json        |  18 +++
 cw/recv.png            | Bin 0 -> 28809 bytes
 cw/src/client.ts       | 118 ++++++++++++++
 cw/src/messages.ts     | 223 +++++++++++++++++++++++++++
 cw/src/server.ts       | 107 +++++++++++++
 cw/src/utils.ts        | 211 +++++++++++++++++++++++++
 cw/tsconfig.json       |  27 ++++
 cw/yarn-error.log      | 343 +++++++++++++++++++++++++++++++++++++++++
 cw/yarn.lock           | 341 ++++++++++++++++++++++++++++++++++++++++
 14 files changed, 1417 insertions(+), 2 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 cw/.gitignore
 create mode 100644 cw/.vscode/launch.json
 create mode 100644 cw/llama.png
 create mode 100644 cw/package.json
 create mode 100644 cw/recv.png
 create mode 100644 cw/src/client.ts
 create mode 100644 cw/src/messages.ts
 create mode 100644 cw/src/server.ts
 create mode 100644 cw/src/utils.ts
 create mode 100644 cw/tsconfig.json
 create mode 100644 cw/yarn-error.log
 create mode 100644 cw/yarn.lock

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cbff306
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+.devcontainer/
+test/
diff --git a/README.md b/README.md
index 8e1e6f2..e159d19 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1 @@
-# COM2022
-
+# Networking
\ No newline at end of file
diff --git a/cw/.gitignore b/cw/.gitignore
new file mode 100644
index 0000000..40b878d
--- /dev/null
+++ b/cw/.gitignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/cw/.vscode/launch.json b/cw/.vscode/launch.json
new file mode 100644
index 0000000..0385ef7
--- /dev/null
+++ b/cw/.vscode/launch.json
@@ -0,0 +1,25 @@
+{
+    "version": "0.2.0",
+    "configurations": [
+        {
+            "name": "ts-node",
+            "type": "node",
+            "request": "launch",
+            "args": [
+                "${relativeFile}"
+            ],
+            "env": {
+                "TS_NODE_COMPILER_OPTIONS":"{\"noUnusedLocals\":false}"
+            },
+            "runtimeArgs": [
+                "--preserve-symlinks",
+                "-r",
+                "ts-node/register"
+            ],
+            "cwd": "${workspaceRoot}",
+            "protocol": "inspector",
+            "console": "internalConsole",
+            // "outputCapture": "std"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/cw/llama.png b/cw/llama.png
new file mode 100644
index 0000000000000000000000000000000000000000..c839beb4cd384f565aa7200ea52dc4689ad80a99
GIT binary patch
literal 28809
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

literal 0
HcmV?d00001

diff --git a/cw/package.json b/cw/package.json
new file mode 100644
index 0000000..61377c6
--- /dev/null
+++ b/cw/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "cw",
+  "version": "1.0.0",
+  "main": "index.js",
+  "license": "MIT",
+  "devDependencies": {
+    "@types/koa-compose": "^3.2.5",
+    "@types/node": "^17.0.25",
+    "ts-node": "^10.7.0",
+    "typescript": "^4.6.3"
+  },
+  "dependencies": {
+    "@noble/secp256k1": "^1.5.5",
+    "async-retry": "^1.3.3",
+    "eciesjs": "^0.3.14",
+    "koa-compose": "^4.1.0"
+  }
+}
diff --git a/cw/recv.png b/cw/recv.png
new file mode 100644
index 0000000000000000000000000000000000000000..c839beb4cd384f565aa7200ea52dc4689ad80a99
GIT binary patch
literal 28809
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

literal 0
HcmV?d00001

diff --git a/cw/src/client.ts b/cw/src/client.ts
new file mode 100644
index 0000000..191378e
--- /dev/null
+++ b/cw/src/client.ts
@@ -0,0 +1,118 @@
+import { Socket } from "net";
+import { createConnection } from "net"
+import { waitForDataUB, writeUB, destroyUB, setMessageID, waitForEncDataUB, writeEncUB, msgListenerUB, } from "./utils";
+import { genIntro, parseIntro, receiveCapabilities, receiveEncCheck, receivePubKey, receiveSymKey, sendCapabilities, sendEncCheck, sendMsg, sendMsgReq, sendPubKey } from "./messages";
+import { getPublicKey, utils } from "@noble/secp256k1"
+import { createCipheriv, createDecipheriv } from "crypto";
+import { createReadStream } from "fs";
+
+
+export async function connect(): Promise<Socket> {
+    const sock = createConnection({ host: "localhost", port: 30522 })
+    return await new Promise(r => {
+        sock.on("connect", () => r(sock))
+    })
+}
+
+export type Context = {
+    conn: Socket
+} & Record<any, any>
+
+
+export const capabilities = [
+    "text:0.0.1",
+    "test:0.0.1",
+    "data:0.0.1"
+]
+
+async function main() {
+
+    const conn = await connect();
+    conn.setKeepAlive()
+    conn.setNoDelay(true)
+
+    conn.on("error", (err) => {
+        console.error(err)
+    })
+    conn.on("end", () => {
+        throw new Error(`Stream closed`)
+    })
+
+    // @ts-ignore
+    conn._writableState.highWaterMark = 1;
+    // @ts-ignore
+    conn._readableState.highWaterMark = 1;
+
+    const destroy = destroyUB.bind(undefined, conn)
+    const write = writeUB.bind(undefined, conn)
+    const waitForData = waitForDataUB.bind(undefined, conn)
+
+    await write(genIntro())
+
+    if (parseIntro(await waitForData())) destroy("Invalid intro")
+
+    console.log("intro done")
+
+    await sendCapabilities(write, capabilities)
+
+    const serverCaps = await receiveCapabilities(waitForData, destroy)
+    console.log("server capabilities: ", serverCaps)
+
+    // agreement.
+    await write(setMessageID(Buffer.alloc(2), 1))
+
+    const serverPubKey = await receivePubKey(waitForData, destroy)
+
+    // console.log("ServerPubKey: ", serverPubKey)
+
+    const privKey = Buffer.from(utils.randomPrivateKey())
+    const pubKey = Buffer.from(getPublicKey(privKey))
+
+    // console.log("pubKey: ", pubKey)
+
+    await sendPubKey(write, pubKey);
+
+    await receiveEncCheck(write, waitForData, destroy, privKey)
+
+    await sendEncCheck(write, waitForData, destroy, serverPubKey)
+
+    const { key, iv } = await receiveSymKey(waitForData, destroy, write, privKey, serverPubKey)
+
+    let cipher = createCipheriv("aes-256-ctr", key, iv)
+    let decipher = createDecipheriv("aes-256-ctr", key, iv)
+
+    const writeEnc = writeEncUB.bind(undefined, conn, cipher)
+
+    const waitForEncData = waitForEncDataUB.bind(undefined, conn, decipher)
+
+    console.log("done")
+
+    // await writeEnc(genIntro())
+
+    // console.log("p2pem:", (await waitForEncData()).toString("utf8"))
+
+    let state = { s: "waiting" }
+    // @ts-ignore
+    const msgListener = msgListenerUB.bind(undefined, writeEnc, waitForEncData, destroy, decipher, state, capabilities)
+    // now we event-emitter bind to the socket to allow for unprompted comms
+    conn.on("data", async (d) => {
+        //@ts-ignore
+        await msgListener(d)
+    })
+
+    state.s = "transmitting"
+    const data = "Hello, World!"
+    const reqStatus = await sendMsgReq(writeEnc, waitForEncData, "data:0.0.1", BigInt(data.length));
+    if (reqStatus) {
+        //const bData = Buffer.from(data, "utf8")
+        const bData = createReadStream("./llama.png")
+        await sendMsg(writeEnc, waitForEncData, bData)
+    } else {
+        console.log("validation failed");
+    }
+
+    console.log("done")
+}
+
+main()
+
diff --git a/cw/src/messages.ts b/cw/src/messages.ts
new file mode 100644
index 0000000..1997ab2
--- /dev/null
+++ b/cw/src/messages.ts
@@ -0,0 +1,223 @@
+import { destroy, getMessageID, setMessageID, SizeChunker, waitForData, write } from "./utils";
+import * as Crypto from "crypto";
+
+import { encrypt, decrypt } from 'eciesjs'
+import { randomBytes } from "crypto";
+import { utils, sign, verify } from "@noble/secp256k1";
+import { Readable } from "stream";
+
+export function genIntro(): Buffer {
+    let t = Buffer.alloc(7)
+    t.writeIntBE(0, 0, 2)
+    t.write("P2PEM", 2, "utf8")
+    return t
+}
+
+export function parseIntro(b: Buffer): boolean {
+    return (b.readIntBE(0, 2) != 0 || b.toString("utf8", 2) !== "P2PEM")
+}
+
+export async function sendCapabilities(write: (d: any) => Promise<unknown>, capabilities: string[]) {
+    //cap primer
+    const capLength = capabilities.length
+    let t = setMessageID(Buffer.alloc(4), 5)
+    t.writeUIntBE(capLength, 2, 2)
+
+    await write(t)
+
+    for (let i = 0; i < capLength; i++) {
+        let cap = capabilities[i]
+        t = setMessageID(Buffer.alloc(2 + 1 + cap.length), 6)
+        t.writeIntBE(cap.length, 2, 1)
+        t.write(cap, 3, "utf8")
+        await write(t);
+    }
+
+}
+
+export async function receiveCapabilities(waitForData: waitForData, destroy: any): Promise<string[]> {
+
+    const capPrimer = await waitForData();
+    if (getMessageID(capPrimer) != 5) destroy("Invalid cap primer message ID")
+
+    const capLength = capPrimer.readUIntBE(2, 2)
+
+    if (capLength > 1024 || capLength < 0) destroy("Invalid capability primer")
+
+    const clientCaps = []
+    for (let i = 0; i < capLength; i++) {
+        let d = await waitForData()
+        if (getMessageID(d) != 6) destroy("Invalid cap message ID")
+        const capLength = d.readUIntBE(2, 1)
+        const recvCap = d.toString("utf8", 3)
+        if (recvCap.length != capLength) {
+            destroy(`Received capability wrong length ${capLength} - ${recvCap}`)
+        }
+        clientCaps.push(recvCap)
+    }
+    return clientCaps
+}
+
+export async function sendPubKey(write: write, pubKey: Buffer) {
+    let t = setMessageID(Buffer.alloc(pubKey.byteLength + 2), 2)
+    pubKey.copy(t, 2)
+    await write(t)
+}
+
+
+export async function receivePubKey(waitForData: waitForData, destroy: destroy) {
+
+    let data = await waitForData();
+    if (getMessageID(data) !== 2) destroy("Expected pubKey message")
+    // const serverPubKey = data.toString("binary", 2)
+    return data.subarray(2)
+
+}
+
+export async function sendEncCheck(write: write, waitForData: waitForData, destroy: destroy, clientPubKey: Buffer) {
+    const byteCount = Crypto.randomInt(1_024, (65_536 - 97))
+
+    const bytes = Crypto.randomBytes(byteCount)
+    const message = setMessageID(Buffer.alloc(byteCount + 97 + 2), 3)
+    const enc = encrypt(clientPubKey, bytes)
+    enc.copy(message, 2)
+
+    await write(message)
+
+    const data = await waitForData();
+
+    if (getMessageID(data) !== 4) destroy("Expected message ID 4")
+
+    if (Buffer.compare(bytes, data.subarray(2)) !== 0) destroy("Encryption ID check buffer content mismatch")
+
+    await sendConfirmation(write)
+
+}
+
+export async function receiveEncCheck(write: write, waitForData: waitForData, destroy: destroy, privKey: Buffer) {
+    let d = await waitForData();
+    if (getMessageID(d) !== 3) destroy("Expected message ID 3")
+
+    const data = decrypt(privKey, d.subarray(2))
+
+    let msg = setMessageID(Buffer.alloc(data.length + 2), 4)
+    data.copy(msg, 2)
+
+    await write(msg)
+
+    d = await waitForData();
+
+    if (getMessageID(d) !== 1) destroy("Expected message ID 1")
+
+}
+
+
+export async function genAndSendSymKey(write: write, waitForData: waitForData, destroy: destroy, privKey: Buffer, clientPubKey: Buffer) {
+
+
+    const key = randomBytes(32)
+    const iv = randomBytes(16)
+    const fullKey = Buffer.alloc(key.length + iv.length)
+    key.copy(fullKey, 0)
+    iv.copy(fullKey, 32)
+
+    const sig = Buffer.from(await sign(await utils.sha256(fullKey), privKey)) // 70 bytes
+
+    const encKey = encrypt(clientPubKey, fullKey) //145 bytes
+
+    let t = setMessageID(Buffer.alloc(2 + 2 + encKey.length + 2 + sig.length), 7)
+    t.writeIntBE(encKey.length, 2, 2)
+    encKey.copy(t, 4)
+    t.writeIntBE(sig.length, encKey.length + 4, 2)
+    sig.copy(t, encKey.length + 6)
+
+    console.log({
+        keyLength: encKey.length, sigLength: sig.length,
+        kfb: encKey.at(0), klb: encKey.at(-1),
+        sfb: sig.at(0), slb: sig.at(-1)
+    })
+
+
+
+    await write(t)
+
+
+    if (getMessageID(await waitForData()) !== 1) destroy("expected confirmation of key validity")
+    return { key, iv }
+
+}
+
+export async function receiveSymKey(waitForData: waitForData, destroy: destroy, write: write, privKey: Buffer, serverPubKey: Buffer) {
+
+    let d = await waitForData()
+
+    if (getMessageID(d) !== 7) destroy("expected ID 7")
+
+    const keyLength = d.readIntBE(2, 2)
+    const encKey = d.subarray(4, keyLength + 4)
+    const sigLength = d.readIntBE(keyLength + 4, 2)
+    const sig = d.subarray(keyLength + 6, keyLength + 6 + sigLength)
+
+    console.log({
+        keyLength, sigLength,
+        kfb: encKey.at(0), klb: encKey.at(-1),
+        sfb: sig.at(0), slb: sig.at(-1)
+    })
+
+    const fullKey = decrypt(privKey, encKey)
+
+    if (!verify(sig, await utils.sha256(fullKey), serverPubKey)) destroy("Invalid signature for encrypted symKey")
+    await sendConfirmation(write)
+
+    const key = fullKey.subarray(0, 32)
+    const iv = fullKey.subarray(32)
+
+    return { key, iv }
+
+}
+
+export async function sendConfirmation(write: write) {
+    await write(setMessageID(Buffer.alloc(2), 1))
+}
+
+
+export async function sendMsgReq(write: write, waitForData: waitForData, capability: string, size: bigint): Promise<Boolean> {
+    let m = setMessageID(Buffer.alloc(2 + 1 + capability.length + 8), 8)
+    m.writeUIntBE(capability.length, 2, 1)
+    m.write(capability, 3, "utf8")
+    m.writeBigUInt64BE(size, capability.length + 3)
+    // m.writeUBigIntBE(size, capability.length + 2, 8)
+    await write(m)
+    const res = await waitForData()
+    if (getMessageID(res) === 9 && res.readIntBE(2, 1) === 1) return true;
+    return false
+}
+
+export async function sendMsg(write: write, waitForData: waitForData, data: Readable) {
+    const ckr = new SizeChunker({
+        chunkSize: 1_000_000,
+        flushTail: true
+    })
+    data.pipe(ckr)
+
+    for await (const chunk of ckr) {
+        const data: Buffer = chunk.data
+        let m = setMessageID(Buffer.alloc(2 + 8), 10)
+        m.writeBigUInt64BE(BigInt(data.length), 2)
+        const hash = Buffer.from(await utils.sha256(data))
+        // hash.copy(m, 10)
+        // data.copy(m, m.length)
+        m = Buffer.concat([m, hash, data])
+        let i = 0;
+        do {
+            await write(m)
+            const res = await waitForData()
+            if (getMessageID(res) !== 11) console.warn("Chunk ack bad ID");
+            if (res.at(2) === 1) i = 4;
+            i++
+        } while (i < 3);
+
+    }
+    console.log("done")
+
+}
\ No newline at end of file
diff --git a/cw/src/server.ts b/cw/src/server.ts
new file mode 100644
index 0000000..8c72f69
--- /dev/null
+++ b/cw/src/server.ts
@@ -0,0 +1,107 @@
+import { genAndSendSymKey, genIntro, parseIntro, receiveCapabilities, receiveEncCheck, receivePubKey, sendCapabilities, sendEncCheck, sendPubKey } from "./messages"
+import { createServer, Socket } from "net"
+import { destroyUB, getMessageID, waitForDataUB, waitForEncDataUB, writeEncUB, writeUB, msgListenerUB } from "./utils"
+
+import { getPublicKey, utils } from "@noble/secp256k1"
+
+import { createCipheriv, createDecipheriv } from "crypto"
+
+
+export async function listen(port = 30522) {
+    const server = createServer()
+    server.listen(port, () => {
+        console.log(`Listening on ${port}`)
+    })
+    server.on("connection", handleConnection)
+}
+
+export const capabilities = [
+    "text:0.0.1",
+    "data:0.0.1"
+]
+
+
+export async function handleConnection(conn: Socket) {
+    const rAddr = `${conn.remoteAddress}:${conn.remotePort}`
+    console.log(`New connection from ${rAddr}`)
+    conn.setKeepAlive()
+    conn.setNoDelay(true)
+    conn.on("error", (err) => {
+        console.error(`${err} from ${rAddr}`);
+        return;
+    })
+    conn.on("end", () => {
+        console.error(`Stream from ${rAddr} closed`)
+        return;
+    })
+
+    // @ts-ignore
+    conn._writableState.highWaterMark = 1;
+    // @ts-ignore
+    conn._readableState.highWaterMark = 1;
+
+    const destroy = destroyUB.bind(undefined, conn)
+    const write = writeUB.bind(undefined, conn)
+    const waitForData = waitForDataUB.bind(undefined, conn)
+
+    if (parseIntro(await waitForData())) destroy("Invalid intro")
+
+    await write(genIntro())
+
+    console.log("intro done")
+
+    const clientCaps = await receiveCapabilities(waitForData, destroy)
+
+    // todo: capability negotiation logic
+
+    await sendCapabilities(write, capabilities)
+
+    console.log("client capabilities: ", clientCaps)
+
+    if (getMessageID(await waitForData()) != 1) destroy("No confirmation for capability negotations")
+
+    const privKey = Buffer.from(utils.randomPrivateKey())
+    const pubKey = Buffer.from(getPublicKey(privKey))
+
+    // console.log("pubKey: ", pubKey)
+
+    await sendPubKey(write, pubKey)
+
+    const clientPubKey = await receivePubKey(waitForData, destroy)
+
+    // console.log("ClientPubKey: ", clientPubKey)
+
+    await sendEncCheck(write, waitForData, destroy, clientPubKey)
+
+    await receiveEncCheck(write, waitForData, destroy, privKey)
+
+    const { key, iv } = await genAndSendSymKey(write, waitForData, destroy, privKey, clientPubKey)
+
+    const cipher = createCipheriv("aes-256-ctr", key, iv)
+    const decipher = createDecipheriv("aes-256-ctr", key, iv)
+
+
+
+    const writeEnc = writeEncUB.bind(undefined, conn, cipher)
+
+    const waitForEncData = waitForEncDataUB.bind(undefined, conn, decipher)
+
+    console.log("done")
+
+    // console.log("p2pem:", (await waitForEncData()).toString("utf8"))
+
+    // await writeEnc(genIntro())
+
+
+    let state = { s: "waiting" }
+    //@ts-ignore
+    const msgListener = msgListenerUB.bind(undefined, writeEnc, waitForEncData, destroy, decipher, state, capabilities)
+    // now we event-emitter bind to the socket to allow for unprompted comms
+    conn.on("data", async (d) => {
+        //@ts-ignore
+        await msgListener(d)
+    })
+
+}
+
+listen()
\ No newline at end of file
diff --git a/cw/src/utils.ts b/cw/src/utils.ts
new file mode 100644
index 0000000..0010d4f
--- /dev/null
+++ b/cw/src/utils.ts
@@ -0,0 +1,211 @@
+
+import { Socket } from "net";
+
+
+import { Cipher, Decipher } from "crypto"
+import { utils } from "@noble/secp256k1";
+
+export const sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));
+
+export type waitForData = () => Promise<Buffer>
+export type write = (d: any) => Promise<unknown>
+export type destroy = (message: any) => void
+
+
+
+export const destroyUB = (conn: Socket, msg: string) => { conn.destroy(new Error(msg)) }
+let sendDelay = 50;
+
+export const writeUB = async (conn: Socket, d: any) => {
+    const diff = sendDelay - performance.now()
+    if (diff > 0) {
+        await sleep(diff)
+    }
+    sendDelay = performance.now() + 50
+    return new Promise((res, rej) => {
+        conn.write(d, (err) => {
+            conn.emit("drain");
+            if (err) rej(err)
+            setImmediate(() => res(true))
+            // res(true)
+        })
+    })
+}
+
+// let writes = 0;
+// let reads = 0;
+
+export const writeEncUB = async (conn: Socket, cipher: Cipher, d: any) => {
+    // console.log("enc writes:", ++writes)
+    await writeUB(conn, cipher.update(d))
+}
+
+export async function waitForDataUB(s: Socket): Promise<Buffer> {
+    return new Promise(res => s.once("data", res))
+}
+
+export async function waitForEncDataUB(s: Socket, decipher: Decipher) {
+    // console.log("enc reads:", ++reads)
+    const eData = await waitForDataUB(s)
+    const decData = decipher.update(eData)
+    return decData
+}
+
+export function getMessageID(b: Buffer) {
+    return b.readIntBE(0, 2)
+}
+
+export function setMessageID(b: Buffer, id: number) {
+    b.writeIntBE(id, 0, 2)
+    return b;
+}
+
+
+export async function msgListenerUB(write: write, waitForData: waitForData, destroy: destroy, decipher: Decipher, state: any, capabilities: string[], d: Buffer) {
+
+    // const { write, destroy, waitForData } = f
+    // let state = f.state;
+    // DO NOT DECRYPT UNLESS NEEDED
+    // WILL DESYNC COUNTERS
+
+    if (state.s === "waiting") {
+        const data = decipher.update(d)
+        if (getMessageID(data) !== 8) destroy("Expected ID 8")
+        const capLen = data.readIntBE(2, 1)
+        const cap = data.toString("utf8", 3, capLen + 3)
+        if (!capabilities.includes(cap)) destroy("Invalid capability")
+        const dataLen = data.readBigUInt64BE(capLen + 3)
+        console.log(`Request for ${cap} with size ${dataLen}`)
+        const res = setMessageID(Buffer.alloc(3), 9)
+        res.writeIntBE(1, 2, 1)
+        state.s = "receiving";
+        state.rec = 0;
+        state.size = dataLen;
+        state.ws = createWriteStream("./recv.data")
+        console.log(res)
+        await write(res)
+        return;
+    } else if (state.s === "receiving") {
+        const data = decipher.update(d)
+        if (getMessageID(data) !== 10) destroy("Expected ID 10 (chunk)")
+        const chnkSize = data.readBigUInt64BE(2)
+        const chnkHash = data.subarray(10, 42)
+        const chnkData = data.subarray(42)
+        const tstHash = await utils.sha256(chnkData)
+        const res = setMessageID(Buffer.alloc(3), 11)
+        if (Buffer.compare(chnkHash, tstHash) !== 0) {
+            res.writeUIntBE(0, 2, 1)
+            await write(res)
+            return;
+        }
+        res.writeUIntBE(1, 2, 1)
+        state.rec += chnkData.length;
+        if (state.rec >= state.size) {
+            console.log("done?")
+            state.ws.end(chnkData)
+            state.s = "waiting"
+        } else {
+            state.ws.write(chnkData)
+        }
+        console.log({ chnkSize, chnkHash: chnkHash.length, chnkData: chnkData.length })
+        await write(res)
+    }
+
+}
+
+
+
+import internal, { Transform } from "stream";
+import { createWriteStream } from "fs";
+import { performance } from "perf_hooks";
+
+export class SizeChunker extends Transform {
+    protected bytesPassed = 0
+    protected currentChunk = -1
+    protected lastEmittedChunk: undefined | number = undefined
+    protected chunkSize;
+    protected flushTail;
+
+    constructor(options: internal.TransformOptions & { chunkSize: number, flushTail: boolean }) {
+        super({ ...options, readableObjectMode: true });
+        this.chunkSize = options.chunkSize ?? 10_000
+        this.flushTail = options.flushTail ?? false
+        this.readableObjectMode
+        this.once("end", () => {
+            if (this.flushTail && (this.lastEmittedChunk !== undefined) && this.bytesPassed > 0) {
+                this.emit("chunkEnd", this.currentChunk, () => { return });
+            }
+        });
+
+    }
+    protected finishChunk(done: any): void {
+        if (this.listenerCount("chunkEnd") > 0) {
+            this.emit("chunkEnd", this.currentChunk, () => {
+                this.bytesPassed = 0;
+                this.lastEmittedChunk = undefined;
+                done();
+            });
+        } else {
+            this.bytesPassed = 0;
+            this.lastEmittedChunk = undefined;
+            done();
+        }
+    }
+
+    protected startChunk(done: any): void {
+        this.currentChunk++;
+        if (this.listenerCount("chunkStart") > 0) {
+            this.emit("chunkStart", this.currentChunk, done)
+        } else {
+            done();
+        }
+    }
+
+    protected pushData(buf: Buffer): void {
+        this.push({
+            data: buf,
+            id: this.currentChunk
+        });
+
+        this.bytesPassed += buf.length;
+    };
+
+    protected startIfNeededAndPushData(buf: Buffer): void {
+        if (this.lastEmittedChunk != this.currentChunk) {
+            this.startChunk(() => {
+                this.lastEmittedChunk = this.currentChunk;
+                this.pushData(buf);
+            })
+        } else {
+            this.pushData(buf);
+        }
+    }
+
+    _transform(chunk: any, _encoding: BufferEncoding, done: internal.TransformCallback): void {
+        const doTransform = () => {
+
+            const bytesLeave = Math.min(chunk.length, this.chunkSize - this.bytesPassed)
+            let remainder;
+
+            if (this.bytesPassed + chunk.length < this.chunkSize) {
+                this.startIfNeededAndPushData(chunk);
+                done();
+            } else {
+
+                remainder = bytesLeave - chunk.length;
+
+                if (remainder === 0) {
+                    this.startIfNeededAndPushData(chunk);
+                    this.finishChunk(done);
+                } else {
+                    this.startIfNeededAndPushData(chunk.slice(0, bytesLeave));
+                    chunk = chunk.slice(bytesLeave);
+                    this.finishChunk(doTransform);
+                }
+            }
+
+        }
+
+        doTransform();
+    }
+}
diff --git a/cw/tsconfig.json b/cw/tsconfig.json
new file mode 100644
index 0000000..9f41421
--- /dev/null
+++ b/cw/tsconfig.json
@@ -0,0 +1,27 @@
+{
+    "compilerOptions": {
+        "allowJs": true,
+        "allowSyntheticDefaultImports": true,
+        "baseUrl": "src",
+        "declaration": true,
+        "esModuleInterop": true,
+        "inlineSourceMap": false,
+        "lib": ["esnext"],
+        "target": "esnext",
+        "listEmittedFiles": false,
+        "listFiles": false,
+        "moduleResolution": "node",
+        "noFallthroughCasesInSwitch": true,
+        "pretty": true,
+        "resolveJsonModule": true,
+        "rootDir": "src",
+        "skipLibCheck": true,
+        "strict": true,
+        "traceResolution": false,
+        "types": ["node"]
+    },
+    "compileOnSave": true,
+    "exclude": ["node_modules"],
+    "include": ["src"]
+
+  }
\ No newline at end of file
diff --git a/cw/yarn-error.log b/cw/yarn-error.log
new file mode 100644
index 0000000..2d2d00a
--- /dev/null
+++ b/cw/yarn-error.log
@@ -0,0 +1,343 @@
+Arguments: 
+  /usr/local/bin/node /usr/share/yarn/bin/yarn.js add -D @types/secp256k1
+
+PATH: 
+  /home/node/.vscode-server/bin/dfd34e8260c270da74b5c2d86d61aee4b6d56977/bin/remote-cli:/usr/local/share/npm-global/bin:/usr/local/share/nvm/current/bin:/usr/local/share/npm-global/bin:/usr/local/share/nvm/current/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/node/.local/bin
+
+Yarn version: 
+  1.22.17
+
+Node version: 
+  16.14.0
+
+Platform: 
+  linux x64
+
+Trace: 
+  Error: EACCES: permission denied, unlink '/workspaces/Networking/cw/node_modules/.bin/acorn'
+
+npm manifest: 
+  {
+    "name": "cw",
+    "version": "1.0.0",
+    "main": "index.js",
+    "license": "MIT",
+    "devDependencies": {
+      "@types/koa-compose": "^3.2.5",
+      "@types/node": "^17.0.25",
+      "ts-node": "^10.7.0",
+      "typescript": "^4.6.3"
+    },
+    "dependencies": {
+      "koa-compose": "^4.1.0",
+      "secp256k1": "^4.0.3"
+    }
+  }
+
+yarn manifest: 
+  No manifest
+
+Lockfile: 
+  # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+  # yarn lockfile v1
+  
+  
+  "@cspotcode/source-map-consumer@0.8.0":
+    version "0.8.0"
+    resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
+    integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
+  
+  "@cspotcode/source-map-support@0.7.0":
+    version "0.7.0"
+    resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
+    integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
+    dependencies:
+      "@cspotcode/source-map-consumer" "0.8.0"
+  
+  "@tsconfig/node10@^1.0.7":
+    version "1.0.8"
+    resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
+    integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
+  
+  "@tsconfig/node12@^1.0.7":
+    version "1.0.9"
+    resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
+    integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
+  
+  "@tsconfig/node14@^1.0.0":
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
+    integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
+  
+  "@tsconfig/node16@^1.0.2":
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
+    integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+  
+  "@types/accepts@*":
+    version "1.3.5"
+    resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+    integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
+    dependencies:
+      "@types/node" "*"
+  
+  "@types/body-parser@*":
+    version "1.19.2"
+    resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
+    integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
+    dependencies:
+      "@types/connect" "*"
+      "@types/node" "*"
+  
+  "@types/connect@*":
+    version "3.4.35"
+    resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+    integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+    dependencies:
+      "@types/node" "*"
+  
+  "@types/content-disposition@*":
+    version "0.5.4"
+    resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8"
+    integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==
+  
+  "@types/cookies@*":
+    version "0.7.7"
+    resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81"
+    integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==
+    dependencies:
+      "@types/connect" "*"
+      "@types/express" "*"
+      "@types/keygrip" "*"
+      "@types/node" "*"
+  
+  "@types/express-serve-static-core@^4.17.18":
+    version "4.17.28"
+    resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8"
+    integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==
+    dependencies:
+      "@types/node" "*"
+      "@types/qs" "*"
+      "@types/range-parser" "*"
+  
+  "@types/express@*":
+    version "4.17.13"
+    resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
+    integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
+    dependencies:
+      "@types/body-parser" "*"
+      "@types/express-serve-static-core" "^4.17.18"
+      "@types/qs" "*"
+      "@types/serve-static" "*"
+  
+  "@types/http-assert@*":
+    version "1.5.3"
+    resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661"
+    integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==
+  
+  "@types/http-errors@*":
+    version "1.8.2"
+    resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1"
+    integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==
+  
+  "@types/keygrip@*":
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
+    integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==
+  
+  "@types/koa-compose@*", "@types/koa-compose@^3.2.5":
+    version "3.2.5"
+    resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d"
+    integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==
+    dependencies:
+      "@types/koa" "*"
+  
+  "@types/koa@*":
+    version "2.13.4"
+    resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b"
+    integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==
+    dependencies:
+      "@types/accepts" "*"
+      "@types/content-disposition" "*"
+      "@types/cookies" "*"
+      "@types/http-assert" "*"
+      "@types/http-errors" "*"
+      "@types/keygrip" "*"
+      "@types/koa-compose" "*"
+      "@types/node" "*"
+  
+  "@types/mime@^1":
+    version "1.3.2"
+    resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+    integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+  
+  "@types/node@*":
+    version "17.0.29"
+    resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.29.tgz#7f2e1159231d4a077bb660edab0fde373e375a3d"
+    integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA==
+  
+  "@types/node@^17.0.25":
+    version "17.0.25"
+    resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448"
+    integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==
+  
+  "@types/qs@*":
+    version "6.9.7"
+    resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+    integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+  
+  "@types/range-parser@*":
+    version "1.2.4"
+    resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+    integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+  
+  "@types/serve-static@*":
+    version "1.13.10"
+    resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
+    integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
+    dependencies:
+      "@types/mime" "^1"
+      "@types/node" "*"
+  
+  acorn-walk@^8.1.1:
+    version "8.2.0"
+    resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+    integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+  
+  acorn@^8.4.1:
+    version "8.7.1"
+    resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+    integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
+  
+  arg@^4.1.0:
+    version "4.1.3"
+    resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+    integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+  
+  bn.js@^4.11.9:
+    version "4.12.0"
+    resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+    integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+  
+  brorand@^1.1.0:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+    integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+  
+  create-require@^1.1.0:
+    version "1.1.1"
+    resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+    integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+  
+  diff@^4.0.1:
+    version "4.0.2"
+    resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+    integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+  
+  elliptic@^6.5.4:
+    version "6.5.4"
+    resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+    integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+    dependencies:
+      bn.js "^4.11.9"
+      brorand "^1.1.0"
+      hash.js "^1.0.0"
+      hmac-drbg "^1.0.1"
+      inherits "^2.0.4"
+      minimalistic-assert "^1.0.1"
+      minimalistic-crypto-utils "^1.0.1"
+  
+  hash.js@^1.0.0, hash.js@^1.0.3:
+    version "1.1.7"
+    resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+    integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+    dependencies:
+      inherits "^2.0.3"
+      minimalistic-assert "^1.0.1"
+  
+  hmac-drbg@^1.0.1:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+    integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+    dependencies:
+      hash.js "^1.0.3"
+      minimalistic-assert "^1.0.0"
+      minimalistic-crypto-utils "^1.0.1"
+  
+  inherits@^2.0.3, inherits@^2.0.4:
+    version "2.0.4"
+    resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+    integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+  
+  koa-compose@^4.1.0:
+    version "4.1.0"
+    resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+    integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
+  
+  make-error@^1.1.1:
+    version "1.3.6"
+    resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+    integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+  
+  minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+    integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+  
+  minimalistic-crypto-utils@^1.0.1:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+    integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+  
+  node-addon-api@^2.0.0:
+    version "2.0.2"
+    resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+    integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+  
+  node-gyp-build@^4.2.0:
+    version "4.4.0"
+    resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4"
+    integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==
+  
+  secp256k1@^4.0.3:
+    version "4.0.3"
+    resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303"
+    integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==
+    dependencies:
+      elliptic "^6.5.4"
+      node-addon-api "^2.0.0"
+      node-gyp-build "^4.2.0"
+  
+  ts-node@^10.7.0:
+    version "10.7.0"
+    resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
+    integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
+    dependencies:
+      "@cspotcode/source-map-support" "0.7.0"
+      "@tsconfig/node10" "^1.0.7"
+      "@tsconfig/node12" "^1.0.7"
+      "@tsconfig/node14" "^1.0.0"
+      "@tsconfig/node16" "^1.0.2"
+      acorn "^8.4.1"
+      acorn-walk "^8.1.1"
+      arg "^4.1.0"
+      create-require "^1.1.0"
+      diff "^4.0.1"
+      make-error "^1.1.1"
+      v8-compile-cache-lib "^3.0.0"
+      yn "3.1.1"
+  
+  typescript@^4.6.3:
+    version "4.6.3"
+    resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
+    integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
+  
+  v8-compile-cache-lib@^3.0.0:
+    version "3.0.1"
+    resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+    integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+  
+  yn@3.1.1:
+    version "3.1.1"
+    resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+    integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
diff --git a/cw/yarn.lock b/cw/yarn.lock
new file mode 100644
index 0000000..7683d11
--- /dev/null
+++ b/cw/yarn.lock
@@ -0,0 +1,341 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@cspotcode/source-map-consumer@0.8.0":
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b"
+  integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
+
+"@cspotcode/source-map-support@0.7.0":
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5"
+  integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
+  dependencies:
+    "@cspotcode/source-map-consumer" "0.8.0"
+
+"@noble/secp256k1@^1.5.5":
+  version "1.5.5"
+  resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3"
+  integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==
+
+"@tsconfig/node10@^1.0.7":
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9"
+  integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
+
+"@tsconfig/node12@^1.0.7":
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c"
+  integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
+
+"@tsconfig/node14@^1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2"
+  integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
+
+"@tsconfig/node16@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e"
+  integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
+
+"@types/accepts@*":
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+  integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
+  dependencies:
+    "@types/node" "*"
+
+"@types/body-parser@*":
+  version "1.19.2"
+  resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
+  integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
+  dependencies:
+    "@types/connect" "*"
+    "@types/node" "*"
+
+"@types/connect@*":
+  version "3.4.35"
+  resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+  integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+  dependencies:
+    "@types/node" "*"
+
+"@types/content-disposition@*":
+  version "0.5.4"
+  resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8"
+  integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==
+
+"@types/cookies@*":
+  version "0.7.7"
+  resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81"
+  integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==
+  dependencies:
+    "@types/connect" "*"
+    "@types/express" "*"
+    "@types/keygrip" "*"
+    "@types/node" "*"
+
+"@types/express-serve-static-core@^4.17.18":
+  version "4.17.28"
+  resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8"
+  integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==
+  dependencies:
+    "@types/node" "*"
+    "@types/qs" "*"
+    "@types/range-parser" "*"
+
+"@types/express@*":
+  version "4.17.13"
+  resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034"
+  integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==
+  dependencies:
+    "@types/body-parser" "*"
+    "@types/express-serve-static-core" "^4.17.18"
+    "@types/qs" "*"
+    "@types/serve-static" "*"
+
+"@types/http-assert@*":
+  version "1.5.3"
+  resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661"
+  integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==
+
+"@types/http-errors@*":
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1"
+  integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w==
+
+"@types/keygrip@*":
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
+  integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==
+
+"@types/koa-compose@*", "@types/koa-compose@^3.2.5":
+  version "3.2.5"
+  resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d"
+  integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa@*":
+  version "2.13.4"
+  resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b"
+  integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==
+  dependencies:
+    "@types/accepts" "*"
+    "@types/content-disposition" "*"
+    "@types/cookies" "*"
+    "@types/http-assert" "*"
+    "@types/http-errors" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/mime@^1":
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+  integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/node@*":
+  version "17.0.29"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.29.tgz#7f2e1159231d4a077bb660edab0fde373e375a3d"
+  integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA==
+
+"@types/node@^17.0.25":
+  version "17.0.25"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448"
+  integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==
+
+"@types/qs@*":
+  version "6.9.7"
+  resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+  integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/range-parser@*":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+  integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+
+"@types/secp256k1@^4.0.3":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c"
+  integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==
+  dependencies:
+    "@types/node" "*"
+
+"@types/serve-static@*":
+  version "1.13.10"
+  resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9"
+  integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==
+  dependencies:
+    "@types/mime" "^1"
+    "@types/node" "*"
+
+acorn-walk@^8.1.1:
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+  integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^8.4.1:
+  version "8.7.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+  integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
+
+arg@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+async-retry@^1.3.3:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280"
+  integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==
+  dependencies:
+    retry "0.13.1"
+
+bn.js@^4.11.9:
+  version "4.12.0"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+brorand@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
+
+create-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+  integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+eciesjs@^0.3.14:
+  version "0.3.14"
+  resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.3.14.tgz#98c98dc519222cdc7b6f9a055b8a7a2e658ab543"
+  integrity sha512-rBbLawo9HRMksRrroYa32RG0BbZ692fRArt1VjeI/pG6hZoSfGTFxxi6jNztJwwNt9EziIGBV7LBczntChmVFw==
+  dependencies:
+    "@types/secp256k1" "^4.0.3"
+    futoin-hkdf "^1.5.0"
+    secp256k1 "^4.0.3"
+
+elliptic@^6.5.4:
+  version "6.5.4"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+  dependencies:
+    bn.js "^4.11.9"
+    brorand "^1.1.0"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.1"
+    inherits "^2.0.4"
+    minimalistic-assert "^1.0.1"
+    minimalistic-crypto-utils "^1.0.1"
+
+futoin-hkdf@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.0.tgz#f10cc4d32f1e26568ded58d5a6535a97aa3a064c"
+  integrity sha512-4CerDhtTgx4i5PKccQIpEp4T9wqmosPIP9Kep35SdCpYkQeriD3zddUVhrO1Fc4QvGhsAnd2rXyoOr5047mJEg==
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+inherits@^2.0.3, inherits@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+koa-compose@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+  integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
+
+make-error@^1.1.1:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
+
+node-addon-api@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+  integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-gyp-build@^4.2.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4"
+  integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==
+
+retry@0.13.1:
+  version "0.13.1"
+  resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
+  integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+
+secp256k1@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303"
+  integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==
+  dependencies:
+    elliptic "^6.5.4"
+    node-addon-api "^2.0.0"
+    node-gyp-build "^4.2.0"
+
+ts-node@^10.7.0:
+  version "10.7.0"
+  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5"
+  integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
+  dependencies:
+    "@cspotcode/source-map-support" "0.7.0"
+    "@tsconfig/node10" "^1.0.7"
+    "@tsconfig/node12" "^1.0.7"
+    "@tsconfig/node14" "^1.0.0"
+    "@tsconfig/node16" "^1.0.2"
+    acorn "^8.4.1"
+    acorn-walk "^8.1.1"
+    arg "^4.1.0"
+    create-require "^1.1.0"
+    diff "^4.0.1"
+    make-error "^1.1.1"
+    v8-compile-cache-lib "^3.0.0"
+    yn "3.1.1"
+
+typescript@^4.6.3:
+  version "4.6.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c"
+  integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
+
+v8-compile-cache-lib@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+  integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+yn@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
-- 
GitLab