From 52565a8a81de92a9824cac7bf6d5cee57e74ff01 Mon Sep 17 00:00:00 2001 From: Alberto Lerda Date: Thu, 28 Sep 2023 12:08:56 +0100 Subject: [PATCH] parser and AST for ethereum plugin --- pkg/ethereum/.npmignore | 1 + pkg/ethereum/package.json | 37 ++ pkg/ethereum/src/read.ts | 377 ++++++++++++++++++++ pkg/ethereum/test/read.ts | 60 ++++ pkg/ethereum/tsconfig.json | 1 + pkg/http/src/read.ts | 26 +- pnpm-lock.yaml | 680 ++++++++++++++++++++++++++++++++++++- 7 files changed, 1161 insertions(+), 21 deletions(-) create mode 120000 pkg/ethereum/.npmignore create mode 100644 pkg/ethereum/package.json create mode 100644 pkg/ethereum/src/read.ts create mode 100644 pkg/ethereum/test/read.ts create mode 120000 pkg/ethereum/tsconfig.json diff --git a/pkg/ethereum/.npmignore b/pkg/ethereum/.npmignore new file mode 120000 index 00000000..b4359f69 --- /dev/null +++ b/pkg/ethereum/.npmignore @@ -0,0 +1 @@ +../../.npmignore \ No newline at end of file diff --git a/pkg/ethereum/package.json b/pkg/ethereum/package.json new file mode 100644 index 00000000..d5a43236 --- /dev/null +++ b/pkg/ethereum/package.json @@ -0,0 +1,37 @@ +{ + "name": "@slangroom/ethereum", + "version": "1.0.0", + "dependencies": { + "@slangroom/core": "workspace:*", + "@slangroom/deps": "workspace:*", + "@slangroom/shared": "workspace:*", + "web3": "^4.1.2" + }, + "repository": "https://github.com/dyne/slangroom", + "license": "AGPL-3.0-only", + "type": "module", + "main": "./build/cjs/src/index.js", + "types": "./build/cjs/src/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./build/esm/src/index.d.ts", + "default": "./build/esm/src/index.js" + }, + "require": { + "types": "./build/cjs/src/index.d.ts", + "default": "./build/cjs/src/index.js" + } + }, + "./*": { + "import": { + "types": "./build/esm/src/*.d.ts", + "default": "./build/esm/src/*.js" + }, + "require": { + "types": "./build/cjs/src/*.d.ts", + "default": "./build/cjs/src/*.js" + } + } + } +} diff --git a/pkg/ethereum/src/read.ts b/pkg/ethereum/src/read.ts new file mode 100644 index 00000000..4622e011 --- /dev/null +++ b/pkg/ethereum/src/read.ts @@ -0,0 +1,377 @@ +import { createToken, Lexer, CstParser } from "@slangroom/deps/chevrotain"; +//import { JsonableObject, Jsonable, JsonableArray } from "@slangroom/shared"; +//import { StmtContext } from "@slangroom/core/slangroom"; +import { Whitespace, Identifier } from "@slangroom/shared/tokens" +import { createSyntaxDiagramsCode } from "@slangroom/deps/chevrotain"; +import fs from 'node:fs' + +export enum EthereumRequestKind { + EthereumNonce, + EthereumGasPrice, + EthereumBytes, + EthereumBalance, + EthereumBroadcast, + Erc20Method, + Erc721Id, + Erc721Owner, + Erc721Asset, +} + +type EthereumRequestWithAddress = { + kind: EthereumRequestKind.EthereumNonce | EthereumRequestKind.EthereumBalance, + address: string, +} + +type EthereumRequestWithTransactionId = { + kind: EthereumRequestKind.EthereumBytes | EthereumRequestKind.Erc721Id, + transactionId: string, +} + +type EthereumRequestWithRawTransaction = { + kind: EthereumRequestKind.EthereumBroadcast, + rawTransaction: string, +} + +type EthereumRequestWithoutArgs = { + kind: EthereumRequestKind.EthereumGasPrice, +} + +type Erc20RequestWithoutArg = { + kind: EthereumRequestKind.Erc20Method, + address: string, +} +type Erc20RequestWithArg = { + kind: EthereumRequestKind.Erc20Method, + arg: string, + address: string, +} +type Erc721RequestWithArgs = { + kind: EthereumRequestKind.Erc721Owner | EthereumRequestKind.Erc721Asset, + nftId: string, + address: string, +} + +type EthereumRequestAST = + EthereumRequestWithAddress + | EthereumRequestWithTransactionId + | EthereumRequestWithoutArgs + | EthereumRequestWithRawTransaction + | Erc20RequestWithArg + | Erc20RequestWithoutArg + | Erc721RequestWithArgs + + + + +const Ethereum = createToken({ + name: "Ethereum", + pattern: /ethereum/i, +}); +const Nonce = createToken({ + name: "Nonce", + pattern: /nonce/i, +}); +const Suggested = createToken({ + name: "Suggested", + pattern: /suggested/i, +}); +const GasPrice = createToken({ + name: "GasPrice", + pattern: /gas price/i, +}); +const For = createToken({ + name: "For", + pattern: /for/i +}); +const With = createToken({ + name: "With", + pattern: /with/i, + group: Lexer.SKIPPED, +}); +const In = createToken({ + name: "In", + pattern: /in/i, +}); +const Of = createToken({ + name: "Of", + pattern: /of/i +}); +const Bytes = createToken({ + name: "Bytes", + pattern: /bytes/i, +}); +const Hash = createToken({ + name: "Hash", + pattern: /hash/i, +}); +const Balance = createToken({ + name: "Balance", + pattern: /balance/i, +}); +const Array = createToken({ + name: "Array", + pattern: /array/i, +}); +const From = createToken({ + name: "From", + pattern: /from/i, +}); +const Erc20 = createToken({ + name: "Erc20", + pattern: /erc20/i, +}); +const Erc721 = createToken({ + name: "Erc721", + pattern: /erc721/i, +}); +const Transaction = createToken({ + name: "Transaction", + pattern: /transaction/i, +}); +const TransactionId = createToken({ + name: "TransactionId", + pattern: /transaction id/i, +}); +const NftId = createToken({ + name: "NftId", + pattern: /nft id/i, +}); +const After = createToken({ + name: "After", + pattern: /after/i, +}); +const Broadcast = createToken({ + name: "Broadcast", + pattern: /broadcast/i, +}); +const The = createToken({ + name: "The", + pattern: /the/i, + group: Lexer.SKIPPED, +}); +const Owner = createToken({ + name: "Owner", + pattern: /owner/i, +}); +const Id = createToken({ + name: "Id", + pattern: /id/i, +}); +const Asset = createToken({ + name: "Asset", + pattern: /asset/i, +}); + +const allTokens = [ + Whitespace, + The, + Ethereum, + Nonce, + Suggested, + GasPrice, + For, + With, + In, + Of, + Bytes, + Hash, + Balance, + Array, + From, + Erc20, + Erc721, + TransactionId, + Transaction, + NftId, + After, + Broadcast, + Asset, + Owner, + Id, + Identifier, +]; +const StatementLexer = new Lexer(allTokens); +// ----------------- parser ----------------- +class StatementParser extends CstParser { + constructor() { + super(allTokens); + + this.performSelfAnalysis(); + } + + public ethereum = this.RULE("ethereum", () => { + this.CONSUME(Ethereum) + this.OR1([ + { ALT: () => { + this.OR2([ + { ALT: () => { + this.CONSUME(Nonce); + this.CONSUME(For); + }}, + { ALT: () => { + this.CONSUME(Bytes); + this.CONSUME(Hash); + }}, + { ALT: () => { + this.CONSUME(Balance); + this.CONSUME2(For); + this.OPTION(() => { + this.CONSUME(Array) + }) + }}, + { ALT: () => { + this.CONSUME(TransactionId); + this.CONSUME(After); + this.CONSUME(Broadcast); + this.CONSUME(Of); + }}, + ]); + this.CONSUME(Identifier); + }}, + { ALT: () => { + this.CONSUME(Suggested); + this.CONSUME(GasPrice); + }}, + ]) + + }) + + public erc20 = this.RULE("erc20", () => { + this.CONSUME(Erc20) + this.CONSUME1(Identifier, {LABEL: "method"}) + this.OPTION(() => { + this.CONSUME(Of); + this.CONSUME2(Identifier, {LABEL: "arg"}); + }) + this.CONSUME(For) + this.CONSUME3(Identifier, {LABEL: "address"}) + }) + + public erc721 = this.RULE("erc721", () => { + this.CONSUME(Erc721) + this.OR([ + { ALT: () => { + this.CONSUME(Id); + this.CONSUME(In); + this.CONSUME(Transaction); + }}, + { ALT: () => { + this.CONSUME(Owner); + this.CONSUME(Of); + this.CONSUME1(Identifier, {LABEL: "nftId"}); + this.CONSUME(For); + }}, + { ALT: () => { + this.CONSUME(Asset); + this.CONSUME2(In); + this.CONSUME2(Identifier, {LABEL: "nftId"}); + this.CONSUME2(For); + }} + ]); + this.CONSUME3(Identifier, {LABEL: "addresOrTxId"}); + }) + + public statement = this.RULE("statement", () => { + this.OR([ + { ALT: () => this.SUBRULE(this.ethereum) }, + { ALT: () => this.SUBRULE(this.erc20) }, + { ALT: () => this.SUBRULE(this.erc721) }, + ]) + }); +} + +const parser = new StatementParser(); +// ----------------- Interpreter ----------------- +const BaseCstVisitor = parser.getBaseCstVisitorConstructor(); + +class StatementInterpreter extends BaseCstVisitor { + constructor() { + super(); + this.validateVisitor(); + } + statement(ctx: any) { + return this.visit(ctx.ethereum || ctx.erc20 || ctx.erc721); + } + ethereum(ctx: any): EthereumRequestAST { + if(ctx.Nonce || ctx.Balance) { + return { + kind: ctx.Nonce ? EthereumRequestKind.EthereumNonce : EthereumRequestKind.EthereumBalance, + address: ctx.Identifier[0].image.slice(1,-1), + } + } else if(ctx.GasPrice) { + return { + kind: EthereumRequestKind.EthereumGasPrice + } + } else if(ctx.Broadcast) { + return { + kind: EthereumRequestKind.EthereumBroadcast, + rawTransaction: ctx.Identifier[0].image.slice(1,-1), + } + } else if(ctx.Bytes) { + return { + kind: EthereumRequestKind.EthereumBytes, + transactionId: ctx.Identifier[0].image.slice(1,-1), + } + } + throw new Error("Should not be here!!") + } + erc20(ctx: any): EthereumRequestAST { + if(ctx.arg) { + return { + kind: EthereumRequestKind.Erc20Method, + arg: ctx.arg[0].image.slice(1,-1), + address: ctx.address[0].image.slice(1,-1), + } + } else { + return { + kind: EthereumRequestKind.Erc20Method, + address: ctx.address[0].image.slice(1,-1), + } + } + } + erc721(ctx: any): EthereumRequestAST { + if(ctx.Asset) { + return { + kind: EthereumRequestKind.Erc721Asset, + nftId: ctx.nftId[0].image.slice(1,-1), + address: ctx.addresOrTxId[0].image.slice(1,-1) + } + } else if(ctx.Owner) { + return { + kind: EthereumRequestKind.Erc721Owner, + nftId: ctx.nftId[0].image.slice(1,-1), + address: ctx.addresOrTxId[0].image.slice(1,-1) + } + } else if(ctx.Id) { + return { + kind: EthereumRequestKind.Erc721Id, + transactionId: ctx.addresOrTxId[0].image.slice(1,-1), + } + } + throw new Error("Should not be here!!") + } +} + +// We only need a single interpreter instance because our interpreter has no state. +const interpreter = new StatementInterpreter(); + + +export const line2Ast = (text: string) => { + const lexResult = StatementLexer.tokenize(text); + parser.input = lexResult.tokens; + const cst = parser.statement(); + const value = interpreter.visit(cst); + return { + value: value, + lexResult: lexResult, + parseErrors: parser.errors, + }; +} + +const serializedGrammar = parser.getSerializedGastProductions(); + +// create the HTML Text +const htmlText = createSyntaxDiagramsCode(serializedGrammar); + +// Write the HTML file to disk +fs.writeFileSync("./generated_diagrams_eth.html", htmlText); diff --git a/pkg/ethereum/test/read.ts b/pkg/ethereum/test/read.ts new file mode 100644 index 00000000..382cdd2c --- /dev/null +++ b/pkg/ethereum/test/read.ts @@ -0,0 +1,60 @@ +import anyTest, {TestFn} from 'ava'; +import { Web3 } from 'web3' + +const test = anyTest as TestFn<{web3: Web3}>; + +import { EthereumRequestKind, line2Ast } from '@slangroom/ethereum/read'; + +test.before(async (t) => { + t.context.web3 = new Web3('http://78.47.38.223:9485') +}); + +test("Ethereum nonce", async (t) => { + const ast = line2Ast("Ethereum nonce for 'foo'"); + t.deepEqual(ast.value, { address: 'foo', kind: EthereumRequestKind.EthereumNonce}) +}) + +test("Ethereum gas price", async (t) => { + const ast = line2Ast("Ethereum suggested gas price"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.EthereumGasPrice}) +}) + +test("Ethereum bytes", async (t) => { + const ast = line2Ast("Ethereum bytes with hash 'foo'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.EthereumBytes, transactionId: 'foo'}) +}) + +test("Ethereum balance", async (t) => { + const ast = line2Ast("Ethereum balance for 'foo'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.EthereumBalance, address: 'foo'}) +}) + +test("Ethereum transaction id after broadcast", async (t) => { + const ast = line2Ast("Ethereum transaction id after broadcast of 'signed tx'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.EthereumBroadcast, rawTransaction: 'signed tx'}) +}) + +test("Erc20 method without arg", async (t) => { + const ast = line2Ast("erc20 'symbol' for 'foo'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.Erc20Method, address: 'foo' }) +}) + +test("Erc20 method with arg", async (t) => { + const ast = line2Ast("erc20 'balance' of 'address' for 'foo'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.Erc20Method, address: 'foo', arg: 'address' }) +}) + +test("Erc721 id", async (t) => { + const ast = line2Ast("erc721 id in transaction 'tx id'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.Erc721Id, transactionId: 'tx id' }) +}) + +test("Erc721 asset", async (t) => { + const ast = line2Ast("erc721 asset in 'nft_id' for 'address'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.Erc721Asset, address: 'address', nftId: 'nft_id' }) +}) + +test("Erc721 owner", async (t) => { + const ast = line2Ast("erc721 owner of 'nft_id' for 'address'"); + t.deepEqual(ast.value, { kind: EthereumRequestKind.Erc721Owner, address: 'address', nftId: 'nft_id' }) +}) diff --git a/pkg/ethereum/tsconfig.json b/pkg/ethereum/tsconfig.json new file mode 120000 index 00000000..fd0e4743 --- /dev/null +++ b/pkg/ethereum/tsconfig.json @@ -0,0 +1 @@ +../../tsconfig.json \ No newline at end of file diff --git a/pkg/http/src/read.ts b/pkg/http/src/read.ts index cbd08a00..4b97624b 100644 --- a/pkg/http/src/read.ts +++ b/pkg/http/src/read.ts @@ -2,7 +2,10 @@ import { createToken, Lexer, CstParser } from "@slangroom/deps/chevrotain"; //import { createSyntaxDiagramsCode } from "chevrotain"; import { JsonableObject, Jsonable, JsonableArray } from "@slangroom/shared"; import { StmtContext } from "@slangroom/core/slangroom"; +import { Whitespace, Identifier } from "@slangroom/shared/tokens" import axios from "axios"; +import { createSyntaxDiagramsCode } from "@slangroom/deps/chevrotain"; +import fs from 'node:fs' export enum Method { GET, @@ -82,20 +85,8 @@ const Different = createToken({ pattern: /different/i, }); -const Identifier = createToken({ - name: "Identifier", - pattern: /'[a-z]+'/i, -}); - - -const WhiteSpace = createToken({ - name: "WhiteSpace", - pattern: /\s+/, - group: Lexer.SKIPPED, -}); - const allTokens = [ - WhiteSpace, + Whitespace, Get, Post, Endpoints, @@ -294,3 +285,12 @@ export const evaluate = async (ast: RequestAST, return results; } } + + +const serializedGrammar = parser.getSerializedGastProductions(); + +// create the HTML Text +const htmlText = createSyntaxDiagramsCode(serializedGrammar); + +// Write the HTML file to disk +fs.writeFileSync("./generated_diagrams_http.html", htmlText); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f51a457..384a1a8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,6 +84,21 @@ importers: specifier: ^3.10.0 version: 3.10.0 + pkg/ethereum: + dependencies: + '@slangroom/core': + specifier: workspace:* + version: link:../core + '@slangroom/deps': + specifier: workspace:* + version: link:../deps + '@slangroom/shared': + specifier: workspace:* + version: link:../shared + web3: + specifier: ^4.1.2 + version: 4.1.2 + pkg/http: dependencies: '@slangroom/core': @@ -116,6 +131,10 @@ importers: packages: + /@adraffy/ens-normalize@1.10.0: + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + dev: false + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -385,6 +404,171 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@ethereumjs/rlp@4.0.1: + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + dev: false + + /@ethersproject/abi@5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/abstract-provider@5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + dev: false + + /@ethersproject/abstract-signer@5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + + /@ethersproject/address@5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: false + + /@ethersproject/base64@5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: false + + /@ethersproject/bignumber@5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: false + + /@ethersproject/bytes@5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/constants@5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: false + + /@ethersproject/hash@5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + + /@ethersproject/keccak256@5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/logger@5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + + /@ethersproject/networks@5.7.1: + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/properties@5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/rlp@5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/signing-key@5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: false + + /@ethersproject/strings@5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + + /@ethersproject/transactions@5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: false + + /@ethersproject/web@5.7.1: + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + /@humanwhocodes/config-array@0.11.10: resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} engines: {node: '>=10.10.0'} @@ -442,6 +626,17 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@noble/curves@1.1.0: + resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + dependencies: + '@noble/hashes': 1.3.1 + dev: false + + /@noble/hashes@1.3.1: + resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} + engines: {node: '>= 16'} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -463,6 +658,25 @@ packages: fastq: 1.15.0 dev: true + /@scure/base@1.1.3: + resolution: {integrity: sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==} + dev: false + + /@scure/bip32@1.3.1: + resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.3 + dev: false + + /@scure/bip39@1.2.1: + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + dependencies: + '@noble/hashes': 1.3.1 + '@scure/base': 1.1.3 + dev: false + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -532,7 +746,6 @@ packages: /@types/node@20.3.1: resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} - dev: true /@types/qs@6.9.8: resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} @@ -561,6 +774,12 @@ packages: '@types/node': 20.3.1 dev: true + /@types/ws@8.5.3: + resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} + dependencies: + '@types/node': 20.3.1 + dev: false + /@typescript-eslint/eslint-plugin@5.59.11(@typescript-eslint/parser@5.59.11)(eslint@8.43.0)(typescript@4.9.5): resolution: {integrity: sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -868,6 +1087,11 @@ packages: - supports-color dev: true + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: false + /axios@1.5.1: resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} dependencies: @@ -891,6 +1115,14 @@ packages: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: true + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: false + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -951,6 +1183,10 @@ packages: fill-range: 7.0.1 dev: true + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: false + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -980,7 +1216,6 @@ packages: dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 - dev: true /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1157,10 +1392,24 @@ packages: engines: {node: '>= 0.6'} dev: true + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1253,6 +1502,18 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: true + /elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + /emittery@1.0.1: resolution: {integrity: sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==} engines: {node: '>=14.16'} @@ -1452,6 +1713,15 @@ packages: engines: {node: '>= 0.6'} dev: true + /ethereum-cryptography@2.1.2: + resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + dependencies: + '@noble/curves': 1.1.0 + '@noble/hashes': 1.3.1 + '@scure/bip32': 1.3.1 + '@scure/bip39': 1.2.1 + dev: false + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -1610,6 +1880,12 @@ packages: optional: true dev: false + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: false + /foreground-child@2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -1651,7 +1927,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -1665,7 +1940,6 @@ packages: has: 1.0.3 has-proto: 1.0.1 has-symbols: 1.0.3 - dev: true /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -1722,6 +1996,12 @@ packages: slash: 4.0.0 dev: true + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: false + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true @@ -1738,19 +2018,38 @@ packages: /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} - dev: true /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - dev: true + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -1811,7 +2110,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -1823,6 +2121,14 @@ packages: engines: {node: '>=8'} dev: true + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1830,6 +2136,11 @@ packages: binary-extensions: 2.2.0 dev: true + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false + /is-error@2.2.2: resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} dev: true @@ -1849,6 +2160,13 @@ packages: engines: {node: '>=12'} dev: true + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1875,6 +2193,13 @@ packages: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} dev: true + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: false + /is-unicode-supported@1.3.0: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} @@ -1884,6 +2209,14 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /isomorphic-ws@5.0.0(ws@8.14.2): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.14.2 + dev: false + /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -1906,6 +2239,10 @@ packages: istanbul-lib-report: 3.0.1 dev: true + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + /js-string-escape@1.0.1: resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} engines: {node: '>= 0.8'} @@ -2077,6 +2414,14 @@ packages: engines: {node: '>=12'} dev: true + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -2115,6 +2460,18 @@ packages: engines: {node: '>= 0.6'} dev: true + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /nofilter@3.1.0: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} engines: {node: '>=12.19'} @@ -2458,6 +2815,10 @@ packages: - supports-color dev: true + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: true @@ -2623,6 +2984,10 @@ packages: engines: {node: '>=0.6'} dev: true + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + /ts-node@10.9.1(@types/node@20.3.1)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2728,6 +3093,16 @@ packages: punycode: 2.3.0 dev: true + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.12 + which-typed-array: 1.1.11 + dev: false + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -2759,11 +3134,283 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: true + /web3-core@4.2.0: + resolution: {integrity: sha512-pkZJx3HAY3b3CutaFarODFgK3TDvcXC4T0n8cpvwiZjDzakUUFAssVUDwrmFyCFKAo5kmfs6qWFW7BAZLJeBFA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-errors: 1.1.2 + web3-eth-iban: 4.0.6 + web3-providers-http: 4.0.6 + web3-providers-ws: 4.0.6 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + optionalDependencies: + web3-providers-ipc: 4.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-errors@1.1.2: + resolution: {integrity: sha512-qlyuV5r6MzjLasIalVWBIIfW4Y7hBX2bZv8TRnXvI1EjiZ36zIFKgE9RF+/iRBjXmOsvIUQQ2Z9gMvYGfOwUwQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-types: 1.2.0 + dev: false + + /web3-eth-abi@4.1.2: + resolution: {integrity: sha512-s8gvjUwzb2ZnAef0Jy68pjmeshYIKBoYlVj/1yuuFP9t3io3oQQIEyGlaCx7P4ifsZ186gMa4QjCCeIt7HYm7Q==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + dev: false + + /web3-eth-accounts@4.0.6: + resolution: {integrity: sha512-xkOXXAEZs2CcR2v33CvFwtGJQS05ye7c3dlXcqwre91fhah9e6u4CPztpyR7HIKegWfIG1DRUwrcEqM2EMo4/w==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + crc-32: 1.2.2 + ethereum-cryptography: 2.1.2 + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + dev: false + + /web3-eth-contract@4.1.0: + resolution: {integrity: sha512-e1eEXSwzNUaC5j0WWDqQ527fPFtIswoJZ/cov8mWvTQi3+dqyI590/6s7IF6A5CGew1RrewAqPMrR9m7WQt7hw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.2.0 + web3-errors: 1.1.2 + web3-eth: 4.2.0 + web3-eth-abi: 4.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-eth-ens@4.0.6: + resolution: {integrity: sha512-ulEX1XRuTojcpWuSd5pk7+CWkE7Yrgi18TcgiQkz+ltQWOVlSHBjcQ/guA9MJoFPa2d3ADSdCbRQEZDZ8Lu3gw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@adraffy/ens-normalize': 1.10.0 + web3-core: 4.2.0 + web3-errors: 1.1.2 + web3-eth: 4.2.0 + web3-eth-contract: 4.1.0 + web3-net: 4.0.6 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-eth-iban@4.0.6: + resolution: {integrity: sha512-q47MbmoYWdfoylHlKZkZRHiPYeiFWqRiHou/wTYJEeZa2D3NG0wuPWz3jeQdZ5NzmS85yh+p2hxa54azVT8qmw==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + dev: false + + /web3-eth-personal@4.0.6: + resolution: {integrity: sha512-QBIl5fH5GPzDfYWxOvOLghnPruopVFfgnYsRmxEu85WAFidBb+XCqIOLmKe4qfF5czPG7gA/7PCPdsPqGNlf7Q==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.2.0 + web3-eth: 4.2.0 + web3-rpc-methods: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-eth@4.2.0: + resolution: {integrity: sha512-8YUEp5bq8j6KzlWpf856e0ZTXSNgJEYPg1gzzrmFC2+l0cjbul7vHnLA7DAsQGrIvXvvHvRp8da/8Ogm+G6FYQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + setimmediate: 1.0.5 + web3-core: 4.2.0 + web3-errors: 1.1.2 + web3-eth-abi: 4.1.2 + web3-eth-accounts: 4.0.6 + web3-net: 4.0.6 + web3-providers-ws: 4.0.6 + web3-rpc-methods: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-net@4.0.6: + resolution: {integrity: sha512-Th4AtgpBgMdt76PmYyNBQxwAd2hAR8hIjhU4xjhqk1JATlXpcfgzyhegeAsvnSht4tcLnVQt6SN4ZVccllpd4A==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.2.0 + web3-rpc-methods: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-providers-http@4.0.6: + resolution: {integrity: sha512-FnBw0X25Xu0FejOgY2Ra7WY4p3fSrHxZuQ5a4j0ytDCE+0wxKQN0BaLRC7+uigbVvwEziQwzrhe+tn8bYAQKXQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + cross-fetch: 3.1.8 + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + transitivePeerDependencies: + - encoding + dev: false + + /web3-providers-ipc@4.0.6: + resolution: {integrity: sha512-17Ky978qGgdSWtctc/WKj9kX+QUypk6arZLI/Rfmq4zQpoR5ngH38CGozRkXUonr9hITYNaLW82NB1SPi1pRPQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + requiresBuild: true + dependencies: + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + dev: false + optional: true + + /web3-providers-ws@4.0.6: + resolution: {integrity: sha512-0Q0SuKpr05gK+tUXdzPNmYlDV3exdqxnHx3f8p3cqz+v66J04EOT31bbETS0VcpDiQ9YaVS8FVSjT4PaseuNag==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + '@types/ws': 8.5.3 + isomorphic-ws: 5.0.0(ws@8.14.2) + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + ws: 8.14.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /web3-rpc-methods@1.1.2: + resolution: {integrity: sha512-fzYp9eJyzq/UBzpP9kOQormelLfvl1kJnX5ucHv4T6kZaQfDuBt5XoYDtCDXSXVaz2MgTowsXwKEVAzN6h7+Ag==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + web3-core: 4.2.0 + web3-types: 1.2.0 + web3-validator: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /web3-types@1.2.0: + resolution: {integrity: sha512-ljx8mrkrOI8fRqvgOdxfpKYoso6n7I8T9LsqXl+Mz2Db0L+2H15an0xgdoWYpKndTPiU2NKRWFiopYifBQzcxQ==} + engines: {node: '>=14', npm: '>=6.12.0'} + dev: false + + /web3-utils@4.0.6: + resolution: {integrity: sha512-nLVtMf9mWTX604XiQQkWZlHLCag9GdHfQtnGJDNaDssTLUx5SpOm1CjhKCHcVcAH/QazEsWcLqUAuyqwKST1kA==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + ethereum-cryptography: 2.1.2 + web3-errors: 1.1.2 + web3-types: 1.2.0 + web3-validator: 2.0.2 + dev: false + + /web3-validator@2.0.2: + resolution: {integrity: sha512-9sQ5owd2UldTsva3o3htj2fTPpbmUwb4TfBXhjIkew8FyT0ss3DPI+j3p6XrfdxIVBEQ5r17YUakElDV99aW+A==} + engines: {node: '>=14', npm: '>=6.12.0'} + dependencies: + ethereum-cryptography: 2.1.2 + util: 0.12.5 + web3-errors: 1.1.2 + web3-types: 1.2.0 + zod: 3.22.2 + dev: false + + /web3@4.1.2: + resolution: {integrity: sha512-BTUCJU7LvL0JDvB1RCRtHe5jFZ0sVYVqHvlNbG4uzebZ6ebtX/CnwiyiJ08UOuvKWzHrZQ+7jPuYuF65BMAXnQ==} + engines: {node: '>=14.0.0', npm: '>=6.12.0'} + dependencies: + web3-core: 4.2.0 + web3-errors: 1.1.2 + web3-eth: 4.2.0 + web3-eth-abi: 4.1.2 + web3-eth-accounts: 4.0.6 + web3-eth-contract: 4.1.0 + web3-eth-ens: 4.0.6 + web3-eth-iban: 4.0.6 + web3-eth-personal: 4.0.6 + web3-net: 4.0.6 + web3-providers-http: 4.0.6 + web3-providers-ws: 4.0.6 + web3-rpc-methods: 1.1.2 + web3-types: 1.2.0 + web3-utils: 4.0.6 + web3-validator: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + /well-known-symbols@2.0.0: resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} engines: {node: '>=6'} dev: true + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: false + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2798,6 +3445,19 @@ packages: signal-exit: 4.1.0 dev: true + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2843,3 +3503,7 @@ packages: /zenroom@3.10.0: resolution: {integrity: sha512-IaULB5zVo7pfC/tT2t5gz/nWK/v+j5rMrcX0lmiu/QMVMgUfmu61mf1vxTi4RJhfizu2R878IoX0Ua0783dpjg==} dev: false + + /zod@3.22.2: + resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} + dev: false