diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6170998..39222da 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,6 +7,17 @@ jobs: runs-on: ${{ matrix.operating-system }} + services: + postgres: + image: postgres:14 + env: + POSTGRES_USER: agora + POSTGRES_PASSWORD: 12345678 + POSTGRES_DB: postgres + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + strategy: fail-fast: false matrix: @@ -31,3 +42,12 @@ jobs: env: REPORT_GAS: true run: cd packages/contracts && yarn run test + + - name: Copy env of Validator + run: cp packages/validator/env/.env.sample packages/validator/env/.env + - name: Check formatting of Validator + run: cd packages/validator && yarn run formatting:check + - name: Compile of Validator + run: cd packages/validator && yarn run build + - name: Run Hardhat Tests of Validator + run: cd packages/validator && yarn run test diff --git a/packages/validator/.dockerignore b/packages/validator/.dockerignore new file mode 100644 index 0000000..6727c1e --- /dev/null +++ b/packages/validator/.dockerignore @@ -0,0 +1,19 @@ +node_modules +artifacts +cache +coverage* +typechain-types +test +.git +.idea +.gitignore +.prettierignore +.prettierrc +.solhint.json +.solhintignore +docker-build.sh +docker-compose.yml +Dockerfile +LICENSE +README.md +tslint.json diff --git a/packages/validator/.gitignore b/packages/validator/.gitignore new file mode 100644 index 0000000..046e575 --- /dev/null +++ b/packages/validator/.gitignore @@ -0,0 +1,142 @@ +# Logs +logs/ +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# WebStorm +.idea + + +typechain-types + +#Hardhat files +cache +artifacts + diff --git a/packages/validator/.prettierignore b/packages/validator/.prettierignore new file mode 100644 index 0000000..1a96237 --- /dev/null +++ b/packages/validator/.prettierignore @@ -0,0 +1,9 @@ +node_modules +artifacts +cache +coverage* +gasReporterOutput.json +typechain-types +.idea +env +docker \ No newline at end of file diff --git a/packages/validator/.prettierrc b/packages/validator/.prettierrc new file mode 100644 index 0000000..9a509c1 --- /dev/null +++ b/packages/validator/.prettierrc @@ -0,0 +1,18 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "printWidth": 120, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": false, + "tabWidth": 4, + "trailingComma": "es5", + "useTabs": false, + "vueIndentScriptAndStyle": false +} diff --git a/packages/validator/.solhint.json b/packages/validator/.solhint.json new file mode 100644 index 0000000..d120893 --- /dev/null +++ b/packages/validator/.solhint.json @@ -0,0 +1,7 @@ +{ + "extends": "solhint:recommended", + "rules": { + "compiler-version": ["error", "^0.8.0"], + "func-visibility": ["warn", { "ignoreConstructors": true }] + } +} diff --git a/packages/validator/.solhintignore b/packages/validator/.solhintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/packages/validator/.solhintignore @@ -0,0 +1 @@ +node_modules diff --git a/packages/validator/Dockerfile b/packages/validator/Dockerfile new file mode 100644 index 0000000..5b666b8 --- /dev/null +++ b/packages/validator/Dockerfile @@ -0,0 +1,13 @@ +FROM node:18-alpine + +RUN apk add --update python3 g++ make yarn +RUN alias python=python3 + +WORKDIR /app/ + +ADD . /app/ +COPY ./env/.env.sample /app/env/.env + +RUN yarn install +RUN yarn run build +ENTRYPOINT [ "/app/docker/entrypoint.sh" ] diff --git a/packages/validator/LICENSE b/packages/validator/LICENSE new file mode 100644 index 0000000..f8317ff --- /dev/null +++ b/packages/validator/LICENSE @@ -0,0 +1,14 @@ +Copyright (c) 2023 BOSAGORA Foundation + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . diff --git a/packages/validator/README.md b/packages/validator/README.md new file mode 100644 index 0000000..5c6773d --- /dev/null +++ b/packages/validator/README.md @@ -0,0 +1 @@ +# bridge-validator \ No newline at end of file diff --git a/packages/validator/config/config.yaml b/packages/validator/config/config.yaml new file mode 100644 index 0000000..47683a3 --- /dev/null +++ b/packages/validator/config/config.yaml @@ -0,0 +1,50 @@ +################################################################################ +## Network interface ## +################################################################################ +server: + # Address to which we bind (default: 127.0.0.1) + address: "${HOST_IP}" + # Port on which we bind (default: 7070) + port: "${HOST_PORT}" + +################################################################################ +## Database options ## +################################################################################ +database: + host: "${DATABASE_HOST}" + user: "${DATABASE_USER}" + password: "${DATABASE_PASSWORD}" + database: "${DATABASE_NAME}" + scheme: "${DATABASE_SCHEME}" + port: "${DATABASE_PORT}" + connectionTimeoutMillis: 5000 + max: 100 + +################################################################################ +## Logging options ## +################################################################################ +logging: + # Values: error, warn, info, http, verbose, debug, silly + level: verbose + +################################################################################ +## Scheduler options ## +################################################################################ +scheduler: + enable: true + items: + - name: bridge + enable: true + expression: "*/10 * * * * *" + +bridge: + networkAContractAddress: "0x10Da82287982A7e3E718F9adE892a566F92C1Be2" + networkAName: "hardhat" + networkBContractAddress: "0x10Da82287982A7e3E718F9adE892a566F92C1Be2" + networkBName: "hardhat" + validators: + - "${BRIDGE_VALIDATOR1}" + - "${BRIDGE_VALIDATOR2}" + - "${BRIDGE_VALIDATOR3}" + - "${BRIDGE_VALIDATOR4}" + - "${BRIDGE_VALIDATOR5}" diff --git a/packages/validator/config/config_test.yaml b/packages/validator/config/config_test.yaml new file mode 100644 index 0000000..2ef1777 --- /dev/null +++ b/packages/validator/config/config_test.yaml @@ -0,0 +1,50 @@ +################################################################################ +## Network interface ## +################################################################################ +server: + # Address to which we bind (default: 127.0.0.1) + address: "${HOST_IP}" + # Port on which we bind (default: 7070) + port: 7501 + +################################################################################ +## Database options ## +################################################################################ +database: + host: "${DATABASE_HOST}" + user: "${DATABASE_USER}" + password: "${DATABASE_PASSWORD}" + database: "${DATABASE_NAME}" + scheme: "${DATABASE_SCHEME}" + port: "${DATABASE_PORT}" + connectionTimeoutMillis: 5000 + max: 100 + +################################################################################ +## Logging options ## +################################################################################ +logging: + # Values: error, warn, info, http, verbose, debug, silly + level: verbose + +################################################################################ +## Scheduler options ## +################################################################################ +scheduler: + enable: true + items: + - name: bridge + enable: true + expression: "*/10 * * * * *" + +bridge: + networkAContractAddress: "0x10Da82287982A7e3E718F9adE892a566F92C1Be2" + networkAName: "hardhat" + networkBContractAddress: "0x10Da82287982A7e3E718F9adE892a566F92C1Be2" + networkBName: "hardhat" + validators: + - "${BRIDGE_VALIDATOR1}" + - "${BRIDGE_VALIDATOR2}" + - "${BRIDGE_VALIDATOR3}" + - "${BRIDGE_VALIDATOR4}" + - "${BRIDGE_VALIDATOR5}" diff --git a/packages/validator/contracts/Reference.sol b/packages/validator/contracts/Reference.sol new file mode 100644 index 0000000..522fe26 --- /dev/null +++ b/packages/validator/contracts/Reference.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later + +pragma solidity ^0.8.2; + +import "loyalty-tokens/contracts/KIOS.sol"; + +import "dms-bridge-contracts/contracts/bridge/Bridge.sol"; +import "dms-bridge-contracts/contracts/bridge/BridgeValidator.sol"; +import "dms-bridge-contracts/contracts/interfaces/IBridge.sol"; +import "dms-bridge-contracts/contracts/interfaces/IBridgeLiquidity.sol"; +import "dms-bridge-contracts/contracts/interfaces/IBridgeValidator.sol"; +import "loyalty-tokens/contracts/BIP20/BIP20DelegatedTransfer.sol"; diff --git a/packages/validator/contracts/token/TestKIOS.sol b/packages/validator/contracts/token/TestKIOS.sol new file mode 100644 index 0000000..61de8d3 --- /dev/null +++ b/packages/validator/contracts/token/TestKIOS.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.2; + +import "loyalty-tokens/contracts/BIP20/BIP20DelegatedTransfer.sol"; + +contract TestKIOS is BIP20DelegatedTransfer { + /* + * Public functions + */ + constructor(address owner_) BIP20DelegatedTransfer("KIOS", "KIOS") { + _mint(owner_, 1e10 * 1e18); + } + + function multiTransfer(address[] calldata to, uint256 amount) public returns (bool) { + for (uint256 idx = 0; idx < to.length; idx++) { + _transfer(msg.sender, to[idx], amount); + } + return true; + } +} diff --git a/packages/validator/docker-build.sh b/packages/validator/docker-build.sh new file mode 100755 index 0000000..168a5ab --- /dev/null +++ b/packages/validator/docker-build.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +TAG_NANE="$(git rev-parse --abbrev-ref HEAD)-$(git rev-parse --short=6 HEAD)" +echo "TAG_NANE=$TAG_NANE" + +docker build -t bosagora/dms-validator:"$TAG_NANE" -f Dockerfile . +# docker push bosagora/dms-validator:"$TAG_NANE" diff --git a/packages/validator/docker-buildx.sh b/packages/validator/docker-buildx.sh new file mode 100755 index 0000000..21236b1 --- /dev/null +++ b/packages/validator/docker-buildx.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +TAG_NANE="$(git rev-parse --abbrev-ref HEAD)-$(git rev-parse --short=6 HEAD)" +echo "TAG_NANE=$TAG_NANE" + +docker buildx build --platform=linux/amd64,linux/arm64 -t bosagora/dms-validator:"$TAG_NANE" -f Dockerfile --push . +docker buildx build --platform=linux/amd64,linux/arm64 -t bosagora/dms-validator:latest -f Dockerfile --push . diff --git a/packages/validator/docker-compose.yml b/packages/validator/docker-compose.yml new file mode 100644 index 0000000..5045202 --- /dev/null +++ b/packages/validator/docker-compose.yml @@ -0,0 +1,25 @@ +version: '3.3' +services: + postgres: + image: postgres:14 + container_name: postgres + ports: + - '5432:5432' + restart: always + command: + [ + "postgres", + "-c", "shared_preload_libraries=pg_stat_statements", + "-c", "max_connections=1000" + ] + environment: + POSTGRES_PASSWORD: 12345678 + POSTGRES_USER: agora + POSTGRES_DB: postgres + PGDATA: /postgresql/data + POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C" + volumes: + - postgres_db:/postgresql/data + +volumes: + postgres_db: diff --git a/packages/validator/docker/entrypoint.sh b/packages/validator/docker/entrypoint.sh new file mode 100755 index 0000000..cd2f2ce --- /dev/null +++ b/packages/validator/docker/entrypoint.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +exec yarn start -- $@ diff --git a/packages/validator/env/.env.sample b/packages/validator/env/.env.sample new file mode 100644 index 0000000..1874d92 --- /dev/null +++ b/packages/validator/env/.env.sample @@ -0,0 +1,22 @@ +# HOST SERVER +HOST_IP=0.0.0.0 +HOST_PORT=7500 + +# CHAIN URL +MAIN_NET_URL=https://mainnet.bosagora.org +TEST_NET_URL=https://testnet.bosagora.org +PRODUCTION_NET_URL=http://localhost:8545 +PRODUCTION_CHAIN_ID=24680 + +# DATABASE INFO +DATABASE_HOST=127.0.0.1 +DATABASE_USER=agora +DATABASE_NAME=bridge +DATABASE_SCHEME= +DATABASE_PASSWORD=12345678 +DATABASE_PORT=5432 + +# 0x6F8CF905906dDe9E440F0DF5B26146cf1f195F12 +DEPLOYER=0x0d451ab5bd459f59fda0cf8018cfbfa4df5c454c5c25a844b70a5afcaf246c98 + +REPORT_GAS=true diff --git a/packages/validator/hardhat.config.ts b/packages/validator/hardhat.config.ts new file mode 100644 index 0000000..858c0ff --- /dev/null +++ b/packages/validator/hardhat.config.ts @@ -0,0 +1,197 @@ +import "@nomiclabs/hardhat-ethers"; +import "@nomiclabs/hardhat-waffle"; +import "@nomiclabs/hardhat-web3"; +import "hardhat-change-network"; +import "@openzeppelin/hardhat-upgrades"; +import "@typechain/hardhat"; +import "hardhat-gas-reporter"; +import "solidity-coverage"; +import "solidity-docgen"; + +import * as dotenv from "dotenv"; +import { Wallet } from "ethers"; +import { HardhatAccount } from "./src/HardhatAccount"; + +dotenv.config({ path: "env/.env" }); + +function getAccounts() { + const accounts: string[] = []; + const reg_bytes64: RegExp = /^(0x)[0-9a-f]{64}$/i; + if ( + process.env.DEPLOYER !== undefined && + process.env.DEPLOYER.trim() !== "" && + reg_bytes64.test(process.env.DEPLOYER) + ) { + accounts.push(process.env.DEPLOYER); + } else { + process.env.DEPLOYER = Wallet.createRandom().privateKey; + accounts.push(process.env.DEPLOYER); + } + + if (process.env.FEE !== undefined && process.env.FEE.trim() !== "" && reg_bytes64.test(process.env.FEE)) { + accounts.push(process.env.FEE); + } else { + process.env.FEE = Wallet.createRandom().privateKey; + accounts.push(process.env.FEE); + } + + if ( + process.env.LINK_VALIDATOR1 !== undefined && + process.env.LINK_VALIDATOR1.trim() !== "" && + reg_bytes64.test(process.env.LINK_VALIDATOR1) + ) { + accounts.push(process.env.LINK_VALIDATOR1); + } else { + process.env.LINK_VALIDATOR1 = Wallet.createRandom().privateKey; + accounts.push(process.env.LINK_VALIDATOR1); + } + + if ( + process.env.LINK_VALIDATOR2 !== undefined && + process.env.LINK_VALIDATOR2.trim() !== "" && + reg_bytes64.test(process.env.LINK_VALIDATOR2) + ) { + accounts.push(process.env.LINK_VALIDATOR2); + } else { + process.env.LINK_VALIDATOR2 = Wallet.createRandom().privateKey; + accounts.push(process.env.LINK_VALIDATOR2); + } + + if ( + process.env.LINK_VALIDATOR3 !== undefined && + process.env.LINK_VALIDATOR3.trim() !== "" && + reg_bytes64.test(process.env.LINK_VALIDATOR3) + ) { + accounts.push(process.env.LINK_VALIDATOR3); + } else { + process.env.LINK_VALIDATOR3 = Wallet.createRandom().privateKey; + accounts.push(process.env.LINK_VALIDATOR3); + } + + if ( + process.env.BRIDGE_VALIDATOR1 !== undefined && + process.env.BRIDGE_VALIDATOR1.trim() !== "" && + reg_bytes64.test(process.env.BRIDGE_VALIDATOR1) + ) { + accounts.push(process.env.BRIDGE_VALIDATOR1); + } else { + process.env.BRIDGE_VALIDATOR1 = Wallet.createRandom().privateKey; + accounts.push(process.env.BRIDGE_VALIDATOR1); + } + + if ( + process.env.BRIDGE_VALIDATOR2 !== undefined && + process.env.BRIDGE_VALIDATOR2.trim() !== "" && + reg_bytes64.test(process.env.BRIDGE_VALIDATOR2) + ) { + accounts.push(process.env.BRIDGE_VALIDATOR2); + } else { + process.env.BRIDGE_VALIDATOR2 = Wallet.createRandom().privateKey; + accounts.push(process.env.BRIDGE_VALIDATOR2); + } + + if ( + process.env.BRIDGE_VALIDATOR3 !== undefined && + process.env.BRIDGE_VALIDATOR3.trim() !== "" && + reg_bytes64.test(process.env.BRIDGE_VALIDATOR3) + ) { + accounts.push(process.env.BRIDGE_VALIDATOR3); + } else { + process.env.BRIDGE_VALIDATOR3 = Wallet.createRandom().privateKey; + accounts.push(process.env.BRIDGE_VALIDATOR3); + } + + if ( + process.env.BRIDGE_VALIDATOR4 !== undefined && + process.env.BRIDGE_VALIDATOR4.trim() !== "" && + reg_bytes64.test(process.env.BRIDGE_VALIDATOR4) + ) { + accounts.push(process.env.BRIDGE_VALIDATOR4); + } else { + process.env.BRIDGE_VALIDATOR4 = Wallet.createRandom().privateKey; + accounts.push(process.env.BRIDGE_VALIDATOR4); + } + + if ( + process.env.BRIDGE_VALIDATOR5 !== undefined && + process.env.BRIDGE_VALIDATOR5.trim() !== "" && + reg_bytes64.test(process.env.BRIDGE_VALIDATOR5) + ) { + accounts.push(process.env.BRIDGE_VALIDATOR5); + } else { + process.env.BRIDGE_VALIDATOR5 = Wallet.createRandom().privateKey; + accounts.push(process.env.BRIDGE_VALIDATOR5); + } + + while (accounts.length < 100) { + accounts.push(Wallet.createRandom().privateKey); + } + + if (HardhatAccount.keys.length === 0) { + for (const account of accounts) { + HardhatAccount.keys.push(account); + } + } + + return accounts; +} + +function getTestAccounts() { + const defaultBalance = "20000000000000000000000000000"; + const acc = getAccounts(); + return acc.map((m) => { + return { + privateKey: m, + balance: defaultBalance, + }; + }); +} + +// You need to export an object to set up your config +// Go to https://hardhat.org/config/ to learn more + +const config = { + solidity: { + compilers: [ + { + version: "0.8.2", + settings: { + optimizer: { + enabled: true, + runs: 2000, + }, + }, + }, + ], + }, + defaultNetwork: "hardhat", + networks: { + hardhat: { + accounts: getTestAccounts(), + gas: 8000000, + gasPrice: 8000000000, + blockGasLimit: 8000000, + }, + bosagora_mainnet: { + url: process.env.MAIN_NET_URL || "", + chainId: 2151, + accounts: getAccounts(), + }, + bosagora_testnet: { + url: process.env.TEST_NET_URL || "", + chainId: 2019, + accounts: getAccounts(), + }, + bosagora_devnet: { + url: "http://localhost:8545", + chainId: 24680, + accounts: getAccounts(), + }, + }, + gasReporter: { + enabled: process.env.REPORT_GAS !== undefined, + currency: "USD", + }, +}; + +export default config; diff --git a/packages/validator/package.json b/packages/validator/package.json new file mode 100644 index 0000000..12344a7 --- /dev/null +++ b/packages/validator/package.json @@ -0,0 +1,116 @@ +{ + "name": "bridge-validator", + "version": "1.0.0", + "description": "Bridge validator the decentralized loyalty point system", + "main": "src/main.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "TESTING=true hardhat test", + "clean": "hardhat clean", + "build": "hardhat compile", + "start:hardhat": "TESTING=false NODE_ENV=production hardhat run src/main.ts", + "start:mainnet": "TESTING=false NODE_ENV=production hardhat run src/main.ts --network bosagora_mainnet", + "start:testnet": "TESTING=false NODE_ENV=production hardhat run src/main.ts --network bosagora_testnet", + "start:devnet": "TESTING=false NODE_ENV=production hardhat run src/main.ts --network bosagora_devnet", + "start:localhost": "TESTING=false NODE_ENV=production hardhat run src/main.ts --network localhost", + "start": "TESTING=false NODE_ENV=production hardhat run src/main.ts --network production_net", + "formatting:check": "prettier '**/*.{json,sol,ts,js,yaml}' -c", + "formatting:write": "prettier '**/*.{json,sol,ts,js,yaml}' --write", + "test:01-Collector": "TESTING=true hardhat test test/01-Collector.test.ts" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/bosagora/dms-bridge.git" + }, + "author": "BOSagora Foundation", + "license": "AGPL-3.0-or-later", + "bugs": { + "url": "https://github.com/bosagora/dms-bridge/issues" + }, + "homepage": "https://github.com/bosagora/dms-bridge#readme", + "devDependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/contracts": "^5.7.0", + "@ethersproject/experimental": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/providers": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/wallet": "^5.7.0", + "@nomiclabs/hardhat-ethers": "^2.2.3", + "@nomiclabs/hardhat-waffle": "^2.0.2", + "@nomiclabs/hardhat-web3": "^2.0.0", + "@openzeppelin/contracts": "^4.9.5", + "@openzeppelin/contracts-upgradeable": "^4.9.5", + "@openzeppelin/hardhat-upgrades": "^1.28.0", + "@typechain/ethers-v5": "^10.1.0", + "@typechain/hardhat": "^6.1.2", + "@types/argparse": "^2.0.2", + "@types/chai": "^4.3.5", + "@types/cors": "^2.8.8", + "@types/express": "^4.17.8", + "@types/extend": "^3.0.1", + "@types/ip": "^1.1.0", + "@types/js-yaml": "^4.0.5", + "@types/mocha": "^10.0.0", + "@types/node": "^12.20.43", + "@types/node-cron": "^3.0.1", + "@types/pg": "^8.10.7", + "@types/urijs": "^1.19.12" + }, + "dependencies": { + "ajv": "^6.12.6", + "argparse": "^2.0.1", + "assert": "^2.0.0", + "axios": "^1.6.7", + "body-parser": "^1.19.0", + "chai": "^4.3.7", + "chai-http": "^4.3.7", + "cors": "^2.8.5", + "dms-bridge-contracts": "^1.2.1", + "dom-parser": "^1.1.5", + "dotenv": "^10.0.0", + "ethereum-waffle": "^4.0.10", + "ethereumjs-util": "^7.1.5", + "ethers": "npm:boa-ethers2@^5.7.9", + "expo-server-sdk": "^3.7.0", + "express": "^4.17.1", + "express-validator": "^6.14.0", + "extend": "^3.0.2", + "hardhat": "^2.12.7", + "hardhat-change-network": "^0.0.7", + "hardhat-gas-reporter": "^1.0.7", + "ip": "^1.1.5", + "loyalty-tokens": "^1.0.5", + "lru-cache": "^10.1.0", + "moment": "^2.29.1", + "multisig-wallet-contracts": "^1.1.0", + "mybatis-mapper": "^0.7.1", + "node-cron": "^3.0.0", + "ntp-time": "^2.0.3", + "pg": "^8.11.3", + "pgtools": "^1.0.1", + "prettier": "^2.5.1", + "prettier-plugin-solidity": "^1.1.1", + "prom-client": "^15.1.0", + "smart-buffer": "^4.1.0", + "solhint": "^3.3.6", + "solidity-coverage": "^0.8.2", + "solidity-docgen": "^0.6.0-beta.35", + "ts-node": "^10.5.0", + "tslint": "^6.1.3", + "tslint-config-prettier": "^1.18.0", + "typechain": "^8.1.0", + "typescript": "^4.5.5", + "urijs": "^1.19.7", + "web3": "^1.7.3", + "winston": "^3.3.3", + "yaml-env-defaults": "^1.1.3" + } +} diff --git a/packages/validator/scripts/exchange.ts b/packages/validator/scripts/exchange.ts new file mode 100644 index 0000000..94b94b9 --- /dev/null +++ b/packages/validator/scripts/exchange.ts @@ -0,0 +1,49 @@ +import { HTTPClient } from "../src/utils/HTTPClient"; + +import { parseFromString } from "dom-parser"; + +async function main() { + const url = "https://www.kita.net/cmmrcInfo/ehgtGnrlzInfo/rltmEhgt.do"; + const client = new HTTPClient(); + const res = await client.get(url); + const rates = []; + if (res.status === 200) { + try { + const text: string = res.data; + const pos0 = text.indexOf(''); + if (pos0 < 0) return []; + const text0 = text.substring(pos0); + const pos1 = text0.indexOf("
"); + if (pos1 < 0) return []; + const text1 = text0.substring(0, pos1 + 8); + const dom = parseFromString(text1); + if (text1 === undefined) return []; + const tbody = dom.getElementsByTagName("tbody"); + if (tbody === undefined || tbody.length === 0) return []; + + const nodes = tbody[0].getElementsByTagName("tr"); + if (nodes === undefined || nodes.length === 0) return []; + + for (const tr of nodes) { + const th = tr.getElementsByTagName("th"); + if (th[0].childNodes[0].childNodes[0].text !== null) { + const symbol = th[0].childNodes[0].childNodes[0].text.toLowerCase(); + const td = tr.getElementsByTagName("td"); + if (td !== undefined && td.length > 0 && td[0].childNodes[0].text !== null) { + const rate = Math.floor(Number(td[0].childNodes[0].text.replace(/[,_]/gi, "")) * 1000000000); + rates.push({ symbol, rate }); + } + } + } + console.log(rates); + return rates; + } catch (error) { + return []; + } + } else return []; +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/packages/validator/scripts/sync.ts b/packages/validator/scripts/sync.ts new file mode 100644 index 0000000..0e977e3 --- /dev/null +++ b/packages/validator/scripts/sync.ts @@ -0,0 +1,12 @@ +import { Client } from "ntp-time"; + +async function main() { + const client = new Client("kr.pool.ntp.org", 123, { timeout: 5000 }); + const res = await client.syncTime(); + console.log(res); +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/packages/validator/src/DefaultServer.ts b/packages/validator/src/DefaultServer.ts new file mode 100644 index 0000000..c2ea5ea --- /dev/null +++ b/packages/validator/src/DefaultServer.ts @@ -0,0 +1,87 @@ +import bodyParser from "body-parser"; +import cors from "cors"; +import { Config } from "./common/Config"; +import { Metrics } from "./metrics/Metrics"; +import { DefaultRouter } from "./routers/DefaultRouter"; +import { Scheduler } from "./scheduler/Scheduler"; +import { WebService } from "./service/WebService"; +import { ValidatorStorage } from "./storage/ValidatorStorage"; + +import { register } from "prom-client"; + +export class DefaultServer extends WebService { + /** + * The configuration of the database + * @private + */ + private readonly config: Config; + private readonly metrics: Metrics; + protected schedules: Scheduler[] = []; + + public readonly defaultRouter: DefaultRouter; + public readonly storage: ValidatorStorage; + + /** + * Constructor + * @param config Configuration + * @param storage + * @param schedules + */ + constructor(config: Config, storage: ValidatorStorage, schedules?: Scheduler[]) { + super(config.server.port, config.server.address); + register.clear(); + this.metrics = new Metrics(); + this.metrics.create("gauge", "status", "serve status"); + + this.config = config; + this.storage = storage; + this.defaultRouter = new DefaultRouter(this, this.metrics); + + if (!schedules) schedules = []; + schedules.forEach((m) => this.schedules.push(m)); + this.schedules.forEach((m) => + m.setOption({ + config: this.config, + storage: this.storage, + }) + ); + } + + /** + * Setup and start the server + */ + public async start(): Promise { + // parse application/x-www-form-urlencoded + this.app.use(bodyParser.urlencoded({ extended: false, limit: "1mb" })); + // parse application/json + this.app.use(bodyParser.json({ limit: "1mb" })); + this.app.use( + cors({ + allowedHeaders: "*", + credentials: true, + methods: "GET, POST", + origin: "*", + preflightContinue: false, + }) + ); + + this.defaultRouter.registerRoutes(); + + for (const m of this.schedules) await m.start(); + + return super.start(); + } + + public stop(): Promise { + return new Promise(async (resolve, reject) => { + for (const m of this.schedules) await m.stop(); + for (const m of this.schedules) await m.waitForStop(); + if (this.server != null) { + this.server.close((err?) => { + if (err) reject(err); + else resolve(); + }); + } else resolve(); + }); + } +} diff --git a/packages/validator/src/HardhatAccount.ts b/packages/validator/src/HardhatAccount.ts new file mode 100644 index 0000000..90be7b7 --- /dev/null +++ b/packages/validator/src/HardhatAccount.ts @@ -0,0 +1,3 @@ +export class HardhatAccount { + public static keys: string[] = []; +} diff --git a/packages/validator/src/common/Amount.ts b/packages/validator/src/common/Amount.ts new file mode 100644 index 0000000..b9d53b1 --- /dev/null +++ b/packages/validator/src/common/Amount.ts @@ -0,0 +1,122 @@ +import { iota } from "../utils/Utils"; + +import { BigNumber } from "ethers"; + +/** + * The class that defines the Amount + */ +export class Amount { + private readonly _value: BigNumber; + private readonly _decimal: number; + + /** + * Constructor + * @param value The amount that have already been reflected + * in the amount below the decimal point + * @param decimal The number of decimal places. + * It is used to convert to other decimal places. + */ + constructor(value: BigNumber, decimal: number = 18) { + this._value = BigNumber.from(value); + if (decimal < 0) throw new Error("Invalid decimal"); + this._decimal = decimal; + } + + /** + * The amount + */ + public get value(): BigNumber { + return this._value; + } + + /** + * The number of decimal places. + */ + public get decimal(): number { + return this._decimal; + } + + /** + * If entered an amount that is BOA, save it as BigNumber considering the decimal point + */ + public static make(boa: string | number, decimal: number = 18): Amount { + if (decimal < 0) throw new Error("Invalid decimal"); + const amount = boa.toString(); + if (amount === "") return new Amount(BigNumber.from("0"), decimal); + const ZeroString = iota(decimal).reduce((p, v) => p + "0", ""); + const numbers = amount.replace(/[,_]/gi, "").split("."); + if (numbers.length === 1) return new Amount(BigNumber.from(numbers[0] + ZeroString), decimal); + let tx_decimal = numbers[1]; + if (tx_decimal.length > decimal) tx_decimal = tx_decimal.slice(0, decimal); + else if (tx_decimal.length < decimal) tx_decimal = tx_decimal.padEnd(decimal, "0"); + const integral = BigNumber.from(numbers[0] + ZeroString); + return new Amount(integral.add(BigNumber.from(tx_decimal)), decimal); + } + + /** + * Converts the number of decimal places. + */ + public convert(decimal: number): Amount { + if (decimal < 0) throw new Error("Invalid decimal"); + if (decimal > this._decimal) { + const factor = decimal - this._decimal; + return new Amount(this._value.mul(BigNumber.from(10).pow(factor)), decimal); + } else if (decimal < this._decimal) { + const factor = this._decimal - decimal; + return new Amount(this._value.div(BigNumber.from(10).pow(factor)), decimal); + } else { + return new Amount(this._value, decimal); + } + } + + /** + * Output to String + */ + public toString(): string { + return this._value.toString(); + } + + /** + * Output to String by BOA unit + */ + public toBOAString(): string { + const factor = BigNumber.from(10).pow(this._decimal); + const integral = this._value.div(factor); + const decimal = this._value.sub(integral.mul(factor)); + const integral_string = integral.toString(); + let decimal_string = decimal.toString(); + if (decimal_string.length < this._decimal) decimal_string = decimal_string.padStart(this._decimal, "0"); + return `${integral_string}.${decimal_string}`; + } + + public toDisplayString(comma: boolean = false, precision: number = 0): string { + const factor = BigNumber.from(10).pow(this._decimal); + const share = this._value.div(factor); + const remain = this._value.sub(share.mul(factor)); + const tx_share = comma + ? share.toNumber().toLocaleString("en-US", { maximumFractionDigits: 7 }) + : share.toString(); + if (remain.eq(BigNumber.from(0))) { + return tx_share; + } else { + let tx_remain = remain.toString(); + if (tx_remain.length < this._decimal) tx_remain = tx_remain.padStart(this._decimal, "0"); + if (precision !== undefined) tx_remain = tx_remain.substring(0, precision); + if (tx_remain.length > 0) return tx_share + "." + tx_remain.replace(/0+$/g, ""); + else return tx_share; + } + } +} + +/** + * Used in the amount of BOA coin in BizNet + */ +export class BOACoin extends Amount { + public static DECIMAL = 18; + constructor(value: BigNumber) { + super(value, BOACoin.DECIMAL); + } + public static make(value: string | number): BOACoin { + return Amount.make(value, BOACoin.DECIMAL); + } +} diff --git a/packages/validator/src/common/Config.ts b/packages/validator/src/common/Config.ts new file mode 100644 index 0000000..0bbac8d --- /dev/null +++ b/packages/validator/src/common/Config.ts @@ -0,0 +1,313 @@ +import { ArgumentParser } from "argparse"; +import { Utils } from "../utils/Utils"; + +import extend from "extend"; +import fs from "fs"; +import ip from "ip"; +import path from "path"; +import { readYamlEnvSync } from "yaml-env-defaults"; + +export class Config implements IConfig { + public server: ServerConfig; + public database: DatabaseConfig; + public logging: LoggingConfig; + public scheduler: SchedulerConfig; + public bridge: BridgeConfig; + + constructor() { + this.server = new ServerConfig(); + this.database = new DatabaseConfig(); + this.logging = new LoggingConfig(); + this.scheduler = new SchedulerConfig(); + this.bridge = new BridgeConfig(); + } + + public static createWithArgument(): Config { + // Parse the arguments + const parser = new ArgumentParser(); + parser.add_argument("-c", "--config", { + default: "config.yaml", + help: "Path to the config file to use", + }); + const args = parser.parse_args(); + + let configPath = path.resolve(Utils.getInitCWD(), args.config); + if (!fs.existsSync(configPath)) configPath = path.resolve(Utils.getInitCWD(), "config", "config.yaml"); + if (!fs.existsSync(configPath)) { + console.error(`Config file '${configPath}' does not exists`); + process.exit(1); + } + + const cfg = new Config(); + try { + cfg.readFromFile(configPath); + } catch (error: any) { + // Logging setup has not been completed and is output to the console. + console.error(error.message); + + // If the process fails to read the configuration file, the process exits. + process.exit(1); + } + return cfg; + } + + public readFromFile(config_file: string) { + const cfg = readYamlEnvSync([path.resolve(Utils.getInitCWD(), config_file)], (key) => { + return (process.env || {})[key]; + }) as IConfig; + this.server.readFromObject(cfg.server); + this.database.readFromObject(cfg.database); + this.logging.readFromObject(cfg.logging); + this.scheduler.readFromObject(cfg.scheduler); + this.bridge.readFromObject(cfg.bridge); + } +} + +export class ServerConfig implements IServerConfig { + public address: string; + public port: number; + + constructor(address?: string, port?: number) { + const conf = extend(true, {}, ServerConfig.defaultValue()); + extend(true, conf, { address, port }); + + if (!ip.isV4Format(conf.address) && !ip.isV6Format(conf.address)) { + console.error(`${conf.address}' is not appropriate to use as an IP address.`); + process.exit(1); + } + + this.address = conf.address; + this.port = conf.port; + } + + public static defaultValue(): IServerConfig { + return { + address: "127.0.0.1", + port: 3000, + }; + } + + public readFromObject(config: IServerConfig) { + const conf = extend(true, {}, ServerConfig.defaultValue()); + extend(true, conf, config); + + if (!ip.isV4Format(conf.address) && !ip.isV6Format(conf.address)) { + console.error(`${conf.address}' is not appropriate to use as an IP address.`); + process.exit(1); + } + this.address = conf.address; + this.port = conf.port; + } +} + +export class DatabaseConfig implements IDatabaseConfig { + host: string; + user: string; + password: string; + database: string; + scheme: string; + port: number; + connectionTimeoutMillis: number; + max: number; + + constructor( + host?: string, + user?: string, + password?: string, + database?: string, + scheme?: string, + port?: number, + connectionTimeoutMillis?: number, + max?: number + ) { + const conf = extend(true, {}, DatabaseConfig.defaultValue()); + extend(true, conf, { + host, + user, + password, + database, + scheme, + port, + connectionTimeoutMillis, + max, + }); + this.host = conf.host; + this.user = conf.user; + this.password = conf.password; + this.database = conf.database; + this.scheme = conf.scheme; + this.port = conf.port; + this.connectionTimeoutMillis = conf.connectionTimeoutMillis; + this.max = conf.max; + } + + public static defaultValue(): IDatabaseConfig { + return { + host: "localhost", + user: "root", + password: "12345678", + database: "relay", + scheme: "", + port: 5432, + connectionTimeoutMillis: 2000, + max: 20, + }; + } + + public readFromObject(config: IDatabaseConfig) { + const conf = extend(true, {}, DatabaseConfig.defaultValue()); + extend(true, conf, config); + this.host = conf.host; + this.user = conf.user; + this.password = conf.password; + this.database = conf.database; + this.scheme = conf.scheme; + this.port = conf.port; + this.connectionTimeoutMillis = conf.connectionTimeoutMillis; + this.max = conf.max; + } +} + +export class LoggingConfig implements ILoggingConfig { + public level: string; + constructor() { + const defaults = LoggingConfig.defaultValue(); + this.level = defaults.level; + } + + public static defaultValue(): ILoggingConfig { + return { + level: "info", + }; + } + + public readFromObject(config: ILoggingConfig) { + if (config.level) this.level = config.level; + } +} + +export class SchedulerConfig implements ISchedulerConfig { + public enable: boolean; + public items: ISchedulerItemConfig[]; + + constructor() { + const defaults = SchedulerConfig.defaultValue(); + this.enable = defaults.enable; + this.items = defaults.items; + } + + public static defaultValue(): ISchedulerConfig { + return { + enable: false, + items: [ + { + name: "node", + enable: false, + expression: "*/1 * * * * *", + }, + ], + } as unknown as ISchedulerConfig; + } + + public readFromObject(config: ISchedulerConfig) { + this.enable = false; + this.items = []; + if (config === undefined) return; + if (config.enable !== undefined) this.enable = config.enable; + if (config.items !== undefined) this.items = config.items; + } + + public getScheduler(name: string): ISchedulerItemConfig | undefined { + return this.items.find((m) => m.name === name); + } +} + +export class BridgeConfig implements IBridgeConfig { + public networkAContractAddress: string; + public networkAName: string; + public networkBContractAddress: string; + public networkBName: string; + public validators: string[]; + + constructor() { + const defaults = BridgeConfig.defaultValue(); + this.networkAContractAddress = defaults.networkAContractAddress; + this.networkAName = defaults.networkAName; + this.networkBContractAddress = defaults.networkBContractAddress; + this.networkBName = defaults.networkBName; + this.validators = defaults.validators; + } + + public readFromObject(config: IBridgeConfig) { + if (config.networkAContractAddress !== undefined) this.networkAContractAddress = config.networkAContractAddress; + if (config.networkAName !== undefined) this.networkAName = config.networkAName; + if (config.networkBContractAddress !== undefined) this.networkBContractAddress = config.networkBContractAddress; + if (config.networkBName !== undefined) this.networkBName = config.networkBName; + if (config.validators !== undefined) this.validators = config.validators; + } + + /** + * Returns default value + */ + public static defaultValue(): IBridgeConfig { + return { + networkAContractAddress: "", + networkAName: "", + networkBContractAddress: "", + networkBName: "", + validators: [], + } as unknown as IBridgeConfig; + } +} + +export interface IServerConfig { + address: string; + port: number; +} + +export interface IDatabaseConfig { + host: string; + user: string; + password: string; + database: string; + scheme: string; + port: number; + connectionTimeoutMillis: number; + max: number; +} + +export interface ILoggingConfig { + level: string; +} + +export interface ISchedulerItemConfig { + name: string; + enable: boolean; + expression: string; +} + +export interface ISchedulerConfig { + enable: boolean; + items: ISchedulerItemConfig[]; + getScheduler(name: string): ISchedulerItemConfig | undefined; +} + +export interface IBridgeConfig { + networkAContractAddress: string; + networkAName: string; + networkBContractAddress: string; + networkBName: string; + validators: string[]; +} + +export interface IConfig { + server: IServerConfig; + + database: IDatabaseConfig; + + logging: ILoggingConfig; + + scheduler: ISchedulerConfig; + + bridge: IBridgeConfig; +} diff --git a/packages/validator/src/common/Logger.ts b/packages/validator/src/common/Logger.ts new file mode 100644 index 0000000..1832e7b --- /dev/null +++ b/packages/validator/src/common/Logger.ts @@ -0,0 +1,35 @@ +import * as winston from "winston"; + +const { combine, timestamp, printf, colorize } = winston.format; +// tslint:disable-next-line:no-shadowed-variable +const customFormat = printf(({ level, timestamp, message }) => { + return `${timestamp} ${level} ${message}`; +}); + +export class Logger { + public static defaultConsoleTransport() { + // console log mode options + const options = { + handleExceptions: true, + json: false, + format: combine( + colorize({ all: true }), + timestamp({ + format: "YYYY-MM-DD HH:mm:ss", + }), + customFormat + ), + }; + + return new winston.transports.Console(options); + } + + public static create(): winston.Logger { + return winston.createLogger({ + level: "verbose", + transports: [Logger.defaultConsoleTransport()], + }); + } +} + +export const logger: winston.Logger = Logger.create(); diff --git a/packages/validator/src/contract/GasPriceManager.ts b/packages/validator/src/contract/GasPriceManager.ts new file mode 100644 index 0000000..5818611 --- /dev/null +++ b/packages/validator/src/contract/GasPriceManager.ts @@ -0,0 +1,63 @@ +"use strict"; + +import "@nomiclabs/hardhat-web3"; +import { BigNumber, ethers } from "ethers"; + +export class GasPriceManager extends ethers.Signer { + readonly signer: ethers.Signer; + + constructor(signer: ethers.Signer) { + super(); + this.signer = signer; + ethers.utils.defineReadOnly(this, "signer", signer); + // @ts-ignore + ethers.utils.defineReadOnly(this, "provider", signer.provider || null); + } + + connect(provider: ethers.providers.Provider): GasPriceManager { + return new GasPriceManager(this.signer.connect(provider)); + } + + getAddress(): Promise { + return this.signer.getAddress(); + } + + getTransactionCount(blockTag?: ethers.providers.BlockTag): Promise { + return this.signer.getTransactionCount(blockTag); + } + + signMessage(message: ethers.Bytes | string): Promise { + return this.signer.signMessage(message); + } + + signTransaction(transaction: ethers.utils.Deferrable): Promise { + return this.signer.signTransaction(transaction); + } + + sendTransaction( + transaction: ethers.utils.Deferrable + ): Promise { + const provider = this.signer.provider; + if (provider === undefined) { + const maxPriorityFeePerGas = 1500000000; + const maxFeePerGas = maxPriorityFeePerGas; + + transaction.maxPriorityFeePerGas = BigNumber.from(maxPriorityFeePerGas); + transaction.maxFeePerGas = BigNumber.from(maxFeePerGas); + return this.signer.sendTransaction(transaction).then((tx) => { + return tx; + }); + } + return provider.getBlock("latest").then((block) => { + const baseFeePerGas = block.baseFeePerGas != null ? block.baseFeePerGas.toNumber() : 0; + const maxPriorityFeePerGas = 1500000000; + const maxFeePerGas = Math.floor(baseFeePerGas * 1.265625) + maxPriorityFeePerGas; + + transaction.maxPriorityFeePerGas = BigNumber.from(maxPriorityFeePerGas); + transaction.maxFeePerGas = BigNumber.from(maxFeePerGas); + return this.signer.sendTransaction(transaction).then((tx) => { + return tx; + }); + }); + } +} diff --git a/packages/validator/src/main.ts b/packages/validator/src/main.ts new file mode 100644 index 0000000..d140224 --- /dev/null +++ b/packages/validator/src/main.ts @@ -0,0 +1,61 @@ +import { Config } from "./common/Config"; +import { logger, Logger } from "./common/Logger"; +import { DefaultServer } from "./DefaultServer"; +import { BridgeScheduler } from "./scheduler/BridgeScheduler"; +import { Scheduler } from "./scheduler/Scheduler"; +import { ValidatorStorage } from "./storage/ValidatorStorage"; +import { ContractUtils } from "./utils/ContractUtils"; + +let server: DefaultServer; + +async function main() { + // Create with the arguments and read from file + const config = Config.createWithArgument(); + + logger.transports.forEach((tp) => { + tp.level = config.logging.level; + }); + + logger.info(`address: ${config.server.address}`); + logger.info(`port: ${config.server.port}`); + + await ContractUtils.delay(3000); + const storage = await ValidatorStorage.make(config.database); + + const schedulers: Scheduler[] = []; + if (config.scheduler.enable) { + const scheduler = config.scheduler.getScheduler("bridge"); + if (scheduler && scheduler.enable) { + schedulers.push(new BridgeScheduler(scheduler.expression)); + } + } + + server = new DefaultServer(config, storage, schedulers); + return server.start().catch((error: any) => { + // handle specific listen errors with friendly messages + switch (error.code) { + case "EACCES": + logger.error(`${config.server.port} requires elevated privileges`); + break; + case "EADDRINUSE": + logger.error(`Port ${config.server.port} is already in use`); + break; + default: + logger.error(`An error occurred while starting the server: ${error.stack}`); + } + process.exit(1); + }); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); + +process.on("SIGINT", () => { + server.stop().then(() => { + process.exit(0); + }); +}); diff --git a/packages/validator/src/metrics/Metrics.ts b/packages/validator/src/metrics/Metrics.ts new file mode 100644 index 0000000..87640bb --- /dev/null +++ b/packages/validator/src/metrics/Metrics.ts @@ -0,0 +1,85 @@ +import { Counter, Gauge, Histogram, LabelValues, register, Registry, Summary } from "prom-client"; + +interface MetricInstances { + type: string; + instance: Counter | Gauge | Histogram | Summary; +} + +export class Metrics { + private registry: Registry; + private instances: Map; + + constructor() { + this.registry = new Registry(); + this.instances = new Map(); + } + + public create(type: string, name: string, help: string) { + let instance: Counter | Gauge | Histogram | Summary; + if (type === "counter") { + instance = new Counter({ name, help }); + this.registry.registerMetric(instance); + this.instances.set(name, { type, instance }); + } else if (type === "gauge") { + instance = new Gauge({ name, help }); + this.registry.registerMetric(instance); + this.instances.set(name, { type, instance }); + } else if (type === "histogram") { + instance = new Histogram({ name, help }); + this.registry.registerMetric(instance); + this.instances.set(name, { type, instance }); + } else if (type === "summary") { + instance = new Summary({ name, help }); + this.registry.registerMetric(instance); + this.instances.set(name, { type, instance }); + } + } + + public add(name: string, data: number) { + const item = this.instances.get(name); + if (item !== undefined) { + if (item.type === "counter") { + (item.instance as Counter).inc(data); + } else if (item.type === "gauge") { + (item.instance as Gauge).set(data); + } else if (item.type === "histogram") { + (item.instance as Histogram).observe(data); + } else if (item.type === "summary") { + (item.instance as Summary).observe(data); + } + } + } + + public gaugeSet(name: string, label: any, data: number) { + const item = this.instances.get(name); + if (item !== undefined) { + if (item.type === "gauge") { + (item.instance as Gauge).labels(label).set(data); + } + } + } + + public gaugeLabels(name: string, label: any, data: number) { + const item = this.instances.get(name); + if (item !== undefined) { + if (item.type === "gauge") { + (item.instance as Gauge).labels(label).set(data); + } + } + } + + public async metrics() { + return this.registry.metrics(); + } + + public contentType() { + return this.registry.contentType; + } + + public createGauge(name: string, help: string, labelNames: string[]) { + const type: string = "gauge"; + const instance = new Gauge({ name, help, labelNames }); + this.registry.registerMetric(instance); + this.instances.set(name, { type, instance }); + } +} diff --git a/packages/validator/src/network/ErrorTypes.ts b/packages/validator/src/network/ErrorTypes.ts new file mode 100644 index 0000000..23f6f69 --- /dev/null +++ b/packages/validator/src/network/ErrorTypes.ts @@ -0,0 +1,98 @@ +export class NetworkError extends Error { + /** + * The status code + */ + public status: number; + + /** + * The status text + */ + public statusText: string; + + /** + * The message of response + */ + public statusMessage: string; + + /** + * Constructor + * @param status The status code + * @param statusText The status text + * @param statusMessage The message of response + */ + constructor(status: number, statusText: string, statusMessage: string) { + super(statusText); + this.name = "NetworkError"; + this.status = status; + this.statusText = statusText; + this.statusMessage = statusMessage; + } +} + +/** + * When status code is 404 + */ +export class NotFoundError extends NetworkError { + /** + * Constructor + * @param status The status code + * @param statusText The status text + * @param statusMessage The message of response + */ + constructor(status: number, statusText: string, statusMessage: string) { + super(status, statusText, statusMessage); + this.name = "NotFoundError"; + } +} + +/** + * When status code is 400 + */ +export class BadRequestError extends NetworkError { + /** + * Constructor + * @param status The status code + * @param statusText The status text + * @param statusMessage The message of response + */ + constructor(status: number, statusText: string, statusMessage: string) { + super(status, statusText, statusMessage); + this.name = "BadRequestError"; + } +} + +/** + * It is a function that handles errors that occur during communication + * with a server for easy use. + * @param error This is why the error occurred + * @returns The instance of Error + */ +export function handleNetworkError(error: any): Error { + if ( + error.response !== undefined && + error.response.status !== undefined && + error.response.statusText !== undefined + ) { + let statusMessage: string; + if (error.response.data !== undefined) { + if (typeof error.response.data === "string") statusMessage = error.response.data; + else if (typeof error.response.data === "object" && error.response.data.statusMessage !== undefined) + statusMessage = error.response.data.statusMessage; + else if (typeof error.response.data === "object" && error.response.data.errorMessage !== undefined) + statusMessage = error.response.data.errorMessage; + else statusMessage = error.response.data.toString(); + } else statusMessage = ""; + + switch (error.response.status) { + case 400: + return new BadRequestError(error.response.status, error.response.statusText, statusMessage); + case 404: + return new NotFoundError(error.response.status, error.response.statusText, statusMessage); + default: + return new NetworkError(error.response.status, error.response.statusText, statusMessage); + } + } else { + if (error.message !== undefined) return new Error(error.message); + else return new Error("An unknown error has occurred."); + } +} diff --git a/packages/validator/src/routers/DefaultRouter.ts b/packages/validator/src/routers/DefaultRouter.ts new file mode 100644 index 0000000..5ca8c34 --- /dev/null +++ b/packages/validator/src/routers/DefaultRouter.ts @@ -0,0 +1,54 @@ +import { WebService } from "../service/WebService"; + +import express from "express"; +import { Metrics } from "../metrics/Metrics"; + +export class DefaultRouter { + /** + * + * @private + */ + private _web_service: WebService; + private readonly _metrics: Metrics; + + /** + * + * @param service WebService + * @param metrics Metrics + */ + constructor(service: WebService, metrics: Metrics) { + this._web_service = service; + this._metrics = metrics; + } + + private get app(): express.Application { + return this._web_service.app; + } + + public registerRoutes() { + // Get Health Status + this.app.get("/", [], this.getHealthStatus.bind(this)); + this.app.get("/metrics", [], this.getMetrics.bind(this)); + } + + private async getHealthStatus(req: express.Request, res: express.Response) { + return res.status(200).json("OK"); + } + private makeResponseData(code: number, data: any, error?: any): any { + return { + code, + data, + error, + }; + } + + /** + * GET /metrics + * @private + */ + private async getMetrics(req: express.Request, res: express.Response) { + res.set("Content-Type", this._metrics.contentType()); + this._metrics.add("status", 1); + res.end(await this._metrics.metrics()); + } +} diff --git a/packages/validator/src/scheduler/BridgeScheduler.ts b/packages/validator/src/scheduler/BridgeScheduler.ts new file mode 100644 index 0000000..30085dc --- /dev/null +++ b/packages/validator/src/scheduler/BridgeScheduler.ts @@ -0,0 +1,87 @@ +import "@nomiclabs/hardhat-ethers"; +import { Config } from "../common/Config"; +import { logger } from "../common/Logger"; +import { ValidatorStorage } from "../storage/ValidatorStorage"; +import { Scheduler } from "./Scheduler"; + +// @ts-ignore +import { BlockNumber } from "web3-core"; +import { EventCollector } from "./EventCollector"; + +export class BridgeScheduler extends Scheduler { + private _config: Config | undefined; + private _storage: ValidatorStorage | undefined; + + private _collectorA: EventCollector | undefined; + private _collectorB: EventCollector | undefined; + + constructor(expression: string) { + super(expression); + } + + private get config(): Config { + if (this._config !== undefined) return this._config; + else { + logger.error("Config is not ready yet."); + process.exit(1); + } + } + + private get storage(): ValidatorStorage { + if (this._storage !== undefined) return this._storage; + else { + logger.error("Storage is not ready yet."); + process.exit(1); + } + } + + public setOption(options: any) { + if (options) { + if (options.config && options.config instanceof Config) this._config = options.config; + if (options.storage && options.storage instanceof ValidatorStorage) this._storage = options.storage; + } + + if (this._config !== undefined && this._storage !== undefined) { + this._collectorA = new EventCollector( + this._config, + this._storage, + this._config.bridge.networkAName, + this._config.bridge.networkAContractAddress, + 1n + ); + + this._collectorB = new EventCollector( + this._config, + this._storage, + this._config.bridge.networkBName, + this._config.bridge.networkBContractAddress, + 1n + ); + } + } + + public get collectorA() { + if (this._collectorA !== undefined) return this._collectorA; + else { + logger.error("collectorA is not ready yet."); + process.exit(1); + } + } + + public get collectorB() { + if (this._collectorB !== undefined) return this._collectorB; + else { + logger.error("_collectorB is not ready yet."); + process.exit(1); + } + } + + protected async work() { + try { + await this.collectorA.work(); + await this.collectorB.work(); + } catch (error) { + logger.error(`Failed to execute the BridgeScheduler: ${error}`); + } + } +} diff --git a/packages/validator/src/scheduler/EventCollector.ts b/packages/validator/src/scheduler/EventCollector.ts new file mode 100644 index 0000000..51a7f34 --- /dev/null +++ b/packages/validator/src/scheduler/EventCollector.ts @@ -0,0 +1,72 @@ +import { IBridge__factory } from "../../typechain-types"; +import { Config } from "../common/Config"; +import { logger } from "../common/Logger"; +import { ValidatorStorage } from "../storage/ValidatorStorage"; + +import { BigNumber } from "ethers"; +import * as hre from "hardhat"; + +export class EventCollector { + private readonly network: string; + private readonly contractAddress: string; + private readonly startNumber: bigint; + private contract: any; + private config: Config | undefined; + private storage: ValidatorStorage; + + constructor( + config: Config, + storage: ValidatorStorage, + network: string, + contractAddress: string, + startBlockNumber: bigint + ) { + this.config = config; + this.storage = storage; + this.network = network; + this.contractAddress = contractAddress; + this.startNumber = startBlockNumber; + } + + private async getLastBlockNumber(): Promise { + const block = await hre.ethers.provider.getBlock("latest"); + return BigNumber.from(block.number); + } + + public async work() { + hre.changeNetwork(this.network); + + let latestCollectedNumber = await this.storage.getLatestNumber(this.network); + if (latestCollectedNumber === undefined) { + latestCollectedNumber = this.startNumber - 1n; + } + + const block = await hre.ethers.provider.getBlock("latest"); + const lastBlockNumber = BigInt(block.number); + + let from = latestCollectedNumber + 1n; + if (from > lastBlockNumber) from = this.startNumber; + + this.contract = new hre.web3.eth.Contract(IBridge__factory.abi as any, this.contractAddress); + const events = await this.contract.getPastEvents("BridgeDeposited", { + fromBlock: Number(from), + toBlock: Number(lastBlockNumber), + }); + + const depositEvents = events.map((m: any) => { + return { + network: this.network, + tokenId: m.returnValues.tokenId, + depositId: m.returnValues.depositId, + account: m.returnValues.account, + amount: BigNumber.from(m.returnValues.amount), + blockNumber: BigInt(m.blockNumber), + transactionHash: m.transactionHash, + }; + }); + + if (depositEvents.length > 0) await this.storage.postEvents(depositEvents); + + await this.storage.setLatestNumber(this.network, lastBlockNumber); + } +} diff --git a/packages/validator/src/scheduler/Scheduler.ts b/packages/validator/src/scheduler/Scheduler.ts new file mode 100644 index 0000000..5556c9b --- /dev/null +++ b/packages/validator/src/scheduler/Scheduler.ts @@ -0,0 +1,176 @@ +import * as cron from "node-cron"; + +/** + * 스케줄러의 실행상태에 대한 정의 + */ +export enum ScheduleState { + NONE = 0, + STARTING = 2, + RUNNING = 3, + STOPPING = 4, + STOPPED = 5, +} + +/** + * A class to perform tasks for a predetermined time. + */ +export class Scheduler { + /** + * Cron 스케줄러 태스크의 객체 + */ + protected task: cron.ScheduledTask | null = null; + + /** + * 스케줄러의 실행상태 + * @protected + */ + protected state: ScheduleState; + + /** + * The period in which the task is performed (in seconds). + */ + protected expression: string; + + /** + * If the work is running, return true + */ + private is_working: boolean = false; + + /** + * Constructor + */ + constructor(expression: string) { + this.expression = expression; + this.state = ScheduleState.NONE; + } + + /** + * 스케줄러를 시작한다. + */ + public async start() { + this.state = ScheduleState.STARTING; + this.is_working = false; + this.task = cron.schedule(this.expression, this.workTask.bind(this)); + this.addEventHandlers(); + this.state = ScheduleState.RUNNING; + await this.onStart(); + } + + // tslint:disable-next-line:no-empty + public async onStart() {} + + /** + * 스케줄러의 종료명령을 실행한다. + * 스케줄러의 진행중인 작업이 완료되기 위해서는 waitForStop 를 이용하여 완료될 때 까지 대기하여야 한다. + */ + public async stop() { + this.state = ScheduleState.STOPPING; + + // 작업이 실행중이 아니면 즉시 종료한다. 그렇지 않으면 대기한다. + if (!this.is_working) { + this.state = ScheduleState.STOPPED; + } + + await this.onStop(); + } + + // tslint:disable-next-line:no-empty + public async onStop() {} + + private stopTask() { + if (this.task !== null) { + this.task.stop(); + this.removeEventHandlers(); + this.task = null; + } + } + + /** + * 스케줄러의 진행중인 작업이 완전히 종료될 때 까지 대기한다. + * @param timeout Timeout milli seconds + */ + public waitForStop(timeout: number = 60000): Promise { + return new Promise((resolve) => { + const start = Math.floor(new Date().getTime() / 1000); + const wait = () => { + if (this.state === ScheduleState.STOPPED) { + this.stopTask(); + resolve(true); + } else { + const now = Math.floor(new Date().getTime() / 1000); + if (now - start < timeout) setTimeout(wait, 10); + else { + this.stopTask(); + resolve(false); + } + } + }; + wait(); + }); + } + + /** + * If the work is running, return true + */ + public isRunning(): boolean { + return this.task !== null; + } + + /** + * If the work is running, return true + */ + public isWorking(): boolean { + return this.is_working; + } + + /** + * Enter the option needed to perform the task + * @param options The option needed to perform the task + */ + // tslint:disable-next-line:no-empty + public setOption(options: any) {} + + /** + * It's a function where the work takes place. + * This method is overridden to implement the actual code. + * @private + */ + private async workTask() { + if (this.state === ScheduleState.STOPPED) return; + if (this.is_working) return; + + this.is_working = true; + try { + await this.work(); + } catch (error) { + console.error(`Failed to execute a scheduler: ${error}`); + } + this.is_working = false; + + if (this.state === ScheduleState.STOPPING) { + this.state = ScheduleState.STOPPED; + } + } + + /** + * It's a function where the work takes place. + * This method is overridden to implement the actual code. + * @protected + */ + // tslint:disable-next-line:no-empty + protected async work() {} + + /** + * Add event handlers + * @protected + */ + // tslint:disable-next-line:no-empty + protected addEventHandlers() {} + + /** + * Remove event handlers + * @protected + */ + // tslint:disable-next-line:no-empty + protected removeEventHandlers() {} +} diff --git a/packages/validator/src/service/WebService.ts b/packages/validator/src/service/WebService.ts new file mode 100644 index 0000000..e037b3c --- /dev/null +++ b/packages/validator/src/service/WebService.ts @@ -0,0 +1,51 @@ +import express from "express"; +import http from "http"; + +export class WebService { + /** + * The application of express module + */ + public app: express.Application; + /** + * The Http server + */ + public server: http.Server | null = null; + /** + * The bind address + */ + private readonly address: string; + /** + * The bind port + */ + private readonly port: number; + + /** + * Constructor + * @param port The bind port + * @param address The bind address + */ + constructor(port: number | string, address: string = "") { + if (typeof port === "string") this.port = parseInt(port, 10); + else this.port = port; + + this.address = address; + + this.app = express(); + } + + /** + * Asynchronously start the web server + */ + public start(): Promise { + // Listen on provided this.port on this.address. + return new Promise((resolve, reject) => { + // Create HTTP server. + this.app.set("port", this.port); + this.server = http.createServer(this.app); + this.server.on("error", reject); + this.server.listen(this.port, this.address, () => { + resolve(); + }); + }); + } +} diff --git a/packages/validator/src/storage/Storage.ts b/packages/validator/src/storage/Storage.ts new file mode 100644 index 0000000..7bd98e6 --- /dev/null +++ b/packages/validator/src/storage/Storage.ts @@ -0,0 +1,84 @@ +import MybatisMapper, { Params } from "mybatis-mapper"; +import pg, { QueryResult, QueryResultRow } from "pg"; +import { createdb } from "pgtools"; +import { IDatabaseConfig } from "../common/Config"; +import { logger } from "../common/Logger"; + +export class Storage { + protected _pool: pg.Pool | undefined; + protected config: IDatabaseConfig; + + constructor(config: IDatabaseConfig) { + this.config = config; + } + + public async initialize() { + if (this.config.database !== "postgres") { + try { + await createdb( + { + user: this.config.user, + password: this.config.password, + host: this.config.host, + port: this.config.port, + }, + this.config.database + ); + // tslint:disable-next-line:no-empty + } catch (e) {} + } + + this._pool = new pg.Pool({ + user: this.config.user, + password: this.config.password, + host: this.config.host, + port: this.config.port, + database: this.config.database, + max: this.config.max, + connectionTimeoutMillis: this.config.connectionTimeoutMillis, + }); + } + + public get pool(): pg.Pool { + if (this._pool !== undefined) return this._pool; + logger.error("Storage is not ready yet."); + process.exit(1); + } + + public createTables(): Promise { + return new Promise((resolve, reject) => { + resolve(); + }); + } + + public close(): Promise { + return this.pool.end(); + } + + public queryForMapper( + namespace: string, + sql_id: string, + param?: Params + ): Promise> { + return new Promise>(async (resolve, reject) => { + try { + const sql = MybatisMapper.getStatement(namespace, sql_id, param, { language: "sql", indent: " " }); + const res = await this.pool.query(sql); + resolve(res); + } catch (err) { + return reject(err); + } + }); + } + + protected exec(sql: string): Promise { + return new Promise(async (resolve, reject) => { + try { + await this.pool.query(sql); + resolve(); + } catch (err) { + return reject(err); + } + }); + } +} diff --git a/packages/validator/src/storage/ValidatorStorage.ts b/packages/validator/src/storage/ValidatorStorage.ts new file mode 100644 index 0000000..715afd3 --- /dev/null +++ b/packages/validator/src/storage/ValidatorStorage.ts @@ -0,0 +1,134 @@ +import { IDatabaseConfig } from "../common/Config"; +import { IBridgeDepositedEvent } from "../types"; +import { Utils } from "../utils/Utils"; +import { Storage } from "./Storage"; + +import MybatisMapper from "mybatis-mapper"; + +import { BigNumber } from "ethers"; + +import path from "path"; +import { BigNumberish } from "@ethersproject/bignumber"; + +/** + * The class that inserts and reads the ledger into the database. + */ +export class ValidatorStorage extends Storage { + constructor(config: IDatabaseConfig) { + super(config); + } + + public async initialize() { + await super.initialize(); + MybatisMapper.createMapper([path.resolve(Utils.getInitCWD(), "src/storage/mapper/table.xml")]); + MybatisMapper.createMapper([path.resolve(Utils.getInitCWD(), "src/storage/mapper/latest_block_number.xml")]); + MybatisMapper.createMapper([path.resolve(Utils.getInitCWD(), "src/storage/mapper/events.xml")]); + await this.createTables(); + } + + public static async make(config: IDatabaseConfig): Promise { + const storage = new ValidatorStorage(config); + await storage.initialize(); + return storage; + } + + public createTables(): Promise { + return this.queryForMapper("table", "create_table", {}); + } + + public async clearTestDB(): Promise { + await this.queryForMapper("table", "clear_table", {}); + } + + public async dropTestDB(): Promise { + await this.queryForMapper("table", "drop_table", {}); + } + + public setLatestNumber(network: string, blockNumber: bigint): Promise { + return new Promise(async (resolve, reject) => { + this.queryForMapper("latest_block_number", "set", { + network, + blockNumber: blockNumber.toString(10), + }) + .then(() => { + return resolve(); + }) + .catch((reason) => { + if (reason instanceof Error) return reject(reason); + return reject(new Error(reason)); + }); + }); + } + + public getLatestNumber(network: string): Promise { + return new Promise(async (resolve, reject) => { + this.queryForMapper("latest_block_number", "get", { + network, + }) + .then((result) => { + if (result.rows.length > 0) { + return resolve(BigInt(result.rows[0].blockNumber)); + } else { + return resolve(undefined); + } + }) + .catch((reason) => { + if (reason instanceof Error) return reject(reason); + return reject(new Error(reason)); + }); + }); + } + + public postEvents(events: IBridgeDepositedEvent[]): Promise { + return new Promise(async (resolve, reject) => { + this.queryForMapper("events", "postEvents", { + events: events.map((m) => { + return { + network: m.network, + depositId: m.depositId, + tokenId: m.tokenId, + account: m.account, + amount: String(m.amount), + blockNumber: m.blockNumber.toString(10), + transactionHash: m.transactionHash, + }; + }) as any, + }) + .then(() => { + return resolve(); + }) + .catch((reason) => { + if (reason instanceof Error) return reject(reason); + return reject(new Error(reason)); + }); + }); + } + + public getEvents(network: string, from: bigint): Promise { + return new Promise(async (resolve, reject) => { + this.queryForMapper("events", "getEvents", { + network, + from: from.toString(10), + }) + .then((result) => { + resolve( + result.rows.map((m) => { + return { + network: m.network, + depositId: m.depositId, + tokenId: m.tokenId, + account: m.account, + amount: BigNumber.from(m.amount), + blockNumber: BigInt(m.blockNumber), + transactionHash: m.transactionHash, + }; + }) + ); + }) + .catch((reason) => { + if (reason instanceof Error) return reject(reason); + return reject(new Error(reason)); + }); + }); + } +} diff --git a/packages/validator/src/storage/mapper/events.xml b/packages/validator/src/storage/mapper/events.xml new file mode 100644 index 0000000..0b9d315 --- /dev/null +++ b/packages/validator/src/storage/mapper/events.xml @@ -0,0 +1,26 @@ + + + + + + INSERT INTO events ("network", "depositId", "tokenId", "account", "amount", "blockNumber", "transactionHash") + VALUES + + ( + #{item.network}, + #{item.depositId}, + #{item.tokenId}, + #{item.account}, + #{item.amount}, + #{item.blockNumber}, + #{item.transactionHash} + ) + + ON CONFLICT ("network", "depositId") DO NOTHING; + + + + diff --git a/packages/validator/src/storage/mapper/latest_block_number.xml b/packages/validator/src/storage/mapper/latest_block_number.xml new file mode 100644 index 0000000..28f1607 --- /dev/null +++ b/packages/validator/src/storage/mapper/latest_block_number.xml @@ -0,0 +1,25 @@ + + + + + + INSERT INTO latest_block_number + ( + "network", + "blockNumber" + ) + VALUES + ( + #{network}, + #{blockNumber} + ) + ON CONFLICT ("network") + DO UPDATE + SET + "blockNumber" = EXCLUDED."blockNumber"; + + + + diff --git a/packages/validator/src/storage/mapper/table.xml b/packages/validator/src/storage/mapper/table.xml new file mode 100644 index 0000000..2cd0677 --- /dev/null +++ b/packages/validator/src/storage/mapper/table.xml @@ -0,0 +1,53 @@ + + + + + + CREATE TABLE IF NOT EXISTS latest_block_number + ( + "network" VARCHAR(32) NOT NULL, + "blockNumber" BIGINT NOT NULL, + PRIMARY KEY ("network") + ); + + + + CREATE TABLE IF NOT EXISTS events + ( + "network" VARCHAR(32) NOT NULL, + "depositId" VARCHAR(66) NOT NULL, + "tokenId" VARCHAR(66) NOT NULL, + "account" VARCHAR(42) NOT NULL, + "amount" VARCHAR(256) NOT NULL, + "blockNumber" BIGINT NOT NULL, + "transactionHash" VARCHAR(66) NOT NULL, + PRIMARY KEY ("network", "depositId") + ); + + + + CREATE TABLE IF NOT EXISTS validators + ( + "validators" VARCHAR(42) NOT NULL, + "depositId" VARCHAR(66) NOT NULL, + "done" VARCHAR(1) DEFAULT 'N', + PRIMARY KEY ("validators", "depositId") + ); + + + + + + + + + diff --git a/packages/validator/src/types/index.ts b/packages/validator/src/types/index.ts new file mode 100644 index 0000000..5c14c87 --- /dev/null +++ b/packages/validator/src/types/index.ts @@ -0,0 +1,14 @@ +import { BigNumber } from "ethers"; + +export const SignatureZero = + "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"; + +export interface IBridgeDepositedEvent { + network: string; + depositId: string; + tokenId: string; + account: string; + amount: BigNumber; + blockNumber: BigInt; + transactionHash: string; +} diff --git a/packages/validator/src/utils/ContractUtils.ts b/packages/validator/src/utils/ContractUtils.ts new file mode 100644 index 0000000..f52fc70 --- /dev/null +++ b/packages/validator/src/utils/ContractUtils.ts @@ -0,0 +1,684 @@ +// tslint:disable-next-line:no-implicit-dependencies +import { defaultAbiCoder, Interface } from "@ethersproject/abi"; +// tslint:disable-next-line:no-implicit-dependencies +import { Signer } from "@ethersproject/abstract-signer"; +// tslint:disable-next-line:no-implicit-dependencies +import { BigNumber, BigNumberish } from "@ethersproject/bignumber"; +// tslint:disable-next-line:no-implicit-dependencies +import { arrayify, BytesLike } from "@ethersproject/bytes"; +// tslint:disable-next-line:no-implicit-dependencies +import { AddressZero } from "@ethersproject/constants"; +// tslint:disable-next-line:no-implicit-dependencies +import { ContractReceipt, ContractTransaction } from "@ethersproject/contracts"; +// tslint:disable-next-line:no-implicit-dependencies +import { id } from "@ethersproject/hash"; +// tslint:disable-next-line:no-implicit-dependencies +import { keccak256 } from "@ethersproject/keccak256"; +// tslint:disable-next-line:no-implicit-dependencies +import { Log } from "@ethersproject/providers"; +// tslint:disable-next-line:no-implicit-dependencies +import { randomBytes } from "@ethersproject/random"; +// tslint:disable-next-line:no-implicit-dependencies +import { verifyMessage } from "@ethersproject/wallet"; + +import * as hre from "hardhat"; + +export enum LoyaltyNetworkID { + KIOS, + PNB, +} + +export class ContractUtils { + public static findLog(receipt: ContractReceipt, iface: Interface, eventName: string): Log | undefined { + return receipt.logs.find((log) => log.topics[0] === id(iface.getEvent(eventName).format("sighash"))); + } + + public static async getEventValue( + tx: ContractTransaction, + iface: Interface, + event: string, + field: string + ): Promise { + const contractReceipt = await tx.wait(); + const log = ContractUtils.findLog(contractReceipt, iface, event); + if (log !== undefined) { + const parsedLog = iface.parseLog(log); + return parsedLog.args[field].toString(); + } + return undefined; + } + + public static async getEventValueBigNumber( + tx: ContractTransaction, + iface: Interface, + event: string, + field: string + ): Promise { + const contractReceipt = await tx.wait(); + const log = ContractUtils.findLog(contractReceipt, iface, event); + if (log !== undefined) { + const parsedLog = iface.parseLog(log); + return parsedLog.args[field]; + } + return undefined; + } + + public static async getEventValueString( + tx: ContractTransaction, + iface: Interface, + event: string, + field: string + ): Promise { + const contractReceipt = await tx.wait(); + const log = ContractUtils.findLog(contractReceipt, iface, event); + if (log !== undefined) { + const parsedLog = iface.parseLog(log); + return parsedLog.args[field]; + } + return undefined; + } + + private static find1_message = "execution reverted:"; + private static find1_length = ContractUtils.find1_message.length; + private static find2_message = "reverted with reason string"; + private static find2_length = ContractUtils.find2_message.length; + public static cacheEVMError(root: any): string { + const reasons: string[] = []; + let error = root; + while (error !== undefined) { + if (error.reason) { + const reason = String(error.reason); + let idx = reason.indexOf(ContractUtils.find1_message); + let message: string; + if (idx >= 0) { + message = reason.substring(idx + ContractUtils.find1_length).trim(); + reasons.push(message); + } + idx = reason.indexOf(ContractUtils.find2_message); + if (idx >= 0) { + message = reason + .substring(idx + ContractUtils.find2_length) + .trim() + .replace(/[/']/gi, ""); + reasons.push(message); + } + } else if (error.message) { + const reason = String(error.message); + let idx = reason.indexOf(ContractUtils.find1_message); + let message: string; + if (idx >= 0) { + message = reason.substring(idx + ContractUtils.find1_length).trim(); + reasons.push(message); + } + idx = reason.indexOf(ContractUtils.find2_message); + if (idx >= 0) { + message = reason + .substring(idx + ContractUtils.find2_length) + .trim() + .replace(/[/']/gi, ""); + reasons.push(message); + } + } + error = error.error; + } + + if (reasons.length > 0) { + return reasons[0]; + } + + if (root.message) { + return root.message; + } else { + return root.toString(); + } + } + + public static isErrorOfEVM(error: any): boolean { + while (error !== undefined) { + if (error.reason) { + return true; + } + error = error.error; + } + return false; + } + + public static StringToBuffer(hex: string): Buffer { + const start = hex.substring(0, 2) === "0x" ? 2 : 0; + return Buffer.from(hex.substring(start), "hex"); + } + + public static BufferToString(data: Buffer): string { + return "0x" + data.toString("hex"); + } + + public static getTimeStamp(): number { + return Math.floor(new Date().getTime() / 1000); + } + + public static getTimeStampBigInt(): bigint { + return BigInt(new Date().getTime()) / BigInt(1000); + } + + public static getTimeStamp10(): number { + return Math.floor(new Date().getTime() / 10000) * 10; + } + + public static delay(interval: number): Promise { + return new Promise((resolve, _) => { + setTimeout(resolve, interval); + }); + } + + // region Phone Link + + public static getPhoneHash(phone: string): string { + const encodedResult = defaultAbiCoder.encode(["string", "string"], ["BOSagora Phone Number", phone]); + return keccak256(encodedResult); + } + + public static getEmailHash(phone: string): string { + const encodedResult = defaultAbiCoder.encode(["string", "string"], ["BOSagora Email", phone]); + return keccak256(encodedResult); + } + + public static getRequestId(hash: string, address: string, nonce: BigNumberish): string { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "address", "uint256", "bytes32"], + [hash, address, nonce, randomBytes(32)] + ); + return keccak256(encodedResult); + } + + public static getRequestMessage( + hash: string, + address: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "address", "uint256", "uint256"], + [hash, address, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getRemoveMessage(address: string, nonce: BigNumberish, chainId?: BigNumberish): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["address", "uint256", "uint256"], + [address, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + // endregion + + // region Shop + + public static getShopId(account: string, networkId: LoyaltyNetworkID): string { + const encodedResult = defaultAbiCoder.encode(["address", "bytes32"], [account, randomBytes(32)]); + const encodedBuffer = this.StringToBuffer(keccak256(encodedResult)); + const networkIdBuffer = Buffer.allocUnsafe(2); + networkIdBuffer.writeUInt16BE(networkId); + return this.BufferToString(Buffer.from([...networkIdBuffer, ...encodedBuffer.subarray(0, 30)])); + } + + public static getShopAccountMessage( + shopId: BytesLike, + account: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "address", "uint256", "uint256"], + [shopId, account, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getShopNameCurrencyAccountMessage( + shopId: BytesLike, + name: string, + currency: string, + account: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "string", "string", "address", "uint256", "uint256"], + [shopId, name, currency, account, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getShopStatusAccountMessage( + shopId: BytesLike, + status: BigNumberish, + account: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "uint256", "address", "uint256", "uint256"], + [shopId, status, account, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getShopDelegatorAccountMessage( + shopId: BytesLike, + delegator: string, + account: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "address", "address", "uint256", "uint256"], + [shopId, delegator, account, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getShopAmountAccountMessage( + shopId: BytesLike, + amount: BigNumberish, + account: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "uint256", "address", "uint256", "uint256"], + [shopId, amount, account, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + // endregion + + // region Ledger + + public static getChangePayablePointMessage( + phone: BytesLike, + address: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "address", "uint256", "uint256"], + [phone, address, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static async signChangePayablePoint( + signer: Signer, + phone: BytesLike, + nonce: BigNumberish, + chainId?: BigNumberish + ): Promise { + const message = ContractUtils.getChangePayablePointMessage(phone, await signer.getAddress(), nonce, chainId); + return signer.signMessage(message); + } + + public static verifyChangePayablePoint( + phone: BytesLike, + account: string, + nonce: BigNumberish, + signature: BytesLike, + chainId?: BigNumberish + ): boolean { + const message = ContractUtils.getChangePayablePointMessage(phone, account, nonce, chainId); + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return false; + } + return res.toLowerCase() === account.toLowerCase(); + } + + public static getLoyaltyTypeMessage(address: string, nonce: BigNumberish, chainId?: BigNumberish): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["address", "uint256", "uint256"], + [address, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static async signLoyaltyType(signer: Signer, nonce: BigNumberish, chainId?: BigNumberish): Promise { + const message = ContractUtils.getLoyaltyTypeMessage(await signer.getAddress(), nonce, chainId); + return signer.signMessage(message); + } + + public static verifyLoyaltyType( + account: string, + nonce: BigNumberish, + signature: string, + chainId?: BigNumberish + ): boolean { + const message = ContractUtils.getLoyaltyTypeMessage(account, nonce, chainId); + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return false; + } + return res.toLowerCase() === account.toLowerCase(); + } + + // endregion + + public static getLoyaltyNewPaymentMessage( + address: string, + paymentId: string, + purchaseId: string, + amount: BigNumberish, + currency: string, + shopId: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "string", "uint256", "string", "bytes32", "address", "uint256", "uint256"], + [ + paymentId, + purchaseId, + amount, + currency, + shopId, + address, + chainId ? chainId : hre.ethers.provider.network.chainId, + nonce, + ] + ); + return arrayify(keccak256(encodedResult)); + } + + public static async signLoyaltyNewPayment( + signer: Signer, + paymentId: string, + purchaseId: string, + amount: BigNumberish, + currency: string, + shopId: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Promise { + const message = ContractUtils.getLoyaltyNewPaymentMessage( + await signer.getAddress(), + paymentId, + purchaseId, + amount, + currency, + shopId, + nonce, + chainId + ); + return signer.signMessage(message); + } + + public static verifyLoyaltyNewPayment( + paymentId: string, + purchaseId: string, + amount: BigNumberish, + currency: string, + shopId: string, + nonce: BigNumberish, + account: string, + signature: BytesLike, + chainId?: BigNumberish + ): boolean { + const message = ContractUtils.getLoyaltyNewPaymentMessage( + account, + paymentId, + purchaseId, + amount, + currency, + shopId, + nonce, + chainId + ); + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return false; + } + return res.toLowerCase() === account.toLowerCase(); + } + + public static getLoyaltyClosePaymentMessage( + address: string, + paymentId: string, + purchaseId: string, + confirm: boolean, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "string", "bool", "address", "uint256", "uint256"], + [paymentId, purchaseId, confirm, address, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static async signLoyaltyClosePayment( + signer: Signer, + paymentId: string, + purchaseId: string, + confirm: boolean, + nonce: BigNumberish, + chainId?: BigNumberish + ): Promise { + const message = ContractUtils.getLoyaltyClosePaymentMessage( + await signer.getAddress(), + paymentId, + purchaseId, + confirm, + nonce, + chainId + ); + return signer.signMessage(message); + } + + public static getLoyaltyCancelPaymentMessage( + address: string, + paymentId: string, + purchaseId: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "string", "address", "uint256", "uint256"], + [paymentId, purchaseId, address, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static async signLoyaltyCancelPayment( + signer: Signer, + paymentId: string, + purchaseId: string, + nonce: BigNumberish, + chainId?: BigNumberish + ): Promise { + const message = ContractUtils.getLoyaltyCancelPaymentMessage( + await signer.getAddress(), + paymentId, + purchaseId, + nonce, + chainId + ); + return signer.signMessage(message); + } + + public static verifyLoyaltyCancelPayment( + paymentId: string, + purchaseId: string, + nonce: BigNumberish, + account: string, + signature: BytesLike, + chainId?: BigNumberish + ): boolean { + const message = ContractUtils.getLoyaltyCancelPaymentMessage(account, paymentId, purchaseId, nonce, chainId); + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return false; + } + return res.toLowerCase() === account.toLowerCase(); + } + + public static getPaymentId(account: string, nonce: BigNumberish): string { + const encodedResult = defaultAbiCoder.encode( + ["address", "uint256", "bytes32"], + [account, nonce, randomBytes(32)] + ); + return keccak256(encodedResult); + } + + public static getTaskId(shopId: string): string { + const encodedResult = defaultAbiCoder.encode( + ["bytes32", "uint256", "bytes32", "bytes32"], + [shopId, ContractUtils.getTimeStamp(), randomBytes(32), randomBytes(32)] + ); + return keccak256(encodedResult); + } + + public static getRandomId(account: string): string { + const encodedResult = defaultAbiCoder.encode(["address", "bytes32"], [account, randomBytes(32)]); + return keccak256(encodedResult); + } + + public static getMobileTokenMessage(address: string, token: string): Uint8Array { + const encodedResult = defaultAbiCoder.encode(["string", "address"], [token, address]); + return arrayify(keccak256(encodedResult)); + } + + public static async signMobileToken(signer: Signer, token: string): Promise { + const message = ContractUtils.getMobileTokenMessage(await signer.getAddress(), token); + return signer.signMessage(message); + } + + public static verifyMobileToken(account: string, token: string, signature: BytesLike): boolean { + const message = ContractUtils.getMobileTokenMessage(account, token); + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return false; + } + return res.toLowerCase() === account.toLowerCase(); + } + + public static getPurchasesMessage( + height: BigNumberish, + purchases: { + purchaseId: string; + amount: BigNumberish; + loyalty: BigNumberish; + currency: string; + shopId: BytesLike; + account: string; + phone: BytesLike; + sender: string; + }[], + chainId?: BigNumberish + ): Uint8Array { + const messages: BytesLike[] = []; + for (const elem of purchases) { + const encodedData = defaultAbiCoder.encode( + ["string", "uint256", "uint256", "string", "bytes32", "address", "bytes32", "address", "uint256"], + [ + elem.purchaseId, + elem.amount, + elem.loyalty, + elem.currency, + elem.shopId, + elem.account, + elem.phone, + elem.sender, + chainId ? chainId : hre.ethers.provider.network.chainId, + ] + ); + messages.push(keccak256(encodedData)); + } + const encodedResult = defaultAbiCoder.encode( + ["uint256", "uint256", "bytes32[]"], + [height, purchases.length, messages] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getCurrencyMessage( + height: BigNumberish, + rates: { symbol: string; rate: BigNumberish }[], + chainId?: BigNumberish + ): Uint8Array { + const messages: BytesLike[] = []; + for (const elem of rates) { + const encodedData = defaultAbiCoder.encode( + ["string", "uint256", "uint256"], + [elem.symbol, elem.rate, chainId ? chainId : hre.ethers.provider.network.chainId] + ); + messages.push(keccak256(encodedData)); + } + const encodedResult = defaultAbiCoder.encode( + ["uint256", "uint256", "bytes32[]"], + [height, rates.length, messages] + ); + return arrayify(keccak256(encodedResult)); + } + + public static getTransferMessage( + from: string, + to: string, + amount: BigNumberish, + nonce: BigNumberish, + chainId?: BigNumberish + ): Uint8Array { + const encodedResult = defaultAbiCoder.encode( + ["address", "address", "uint256", "uint256", "uint256"], + [from, to, amount, chainId ? chainId : hre.ethers.provider.network.chainId, nonce] + ); + return arrayify(keccak256(encodedResult)); + } + + public static async signMessage(signer: Signer, message: Uint8Array): Promise { + return signer.signMessage(message); + } + + public static verifyMessage(account: string, message: Uint8Array, signature: string): boolean { + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return false; + } + return res.toLowerCase() === account.toLowerCase(); + } + + public static verifySignature(message: Uint8Array, signature: BytesLike): string { + let res: string; + try { + res = verifyMessage(message, signature); + } catch (error) { + return AddressZero; + } + return res; + } + + public static zeroGWEI(value: BigNumber): BigNumber { + return value.div(1000000000).mul(1000000000); + } + + public static getSecret(): [string, string] { + const secret = "0x" + Buffer.from(randomBytes(32)).toString("hex"); + const secretLock = keccak256(defaultAbiCoder.encode(["bytes32"], [secret])); + return [secret, secretLock]; + } + + public static getTokenId(name: string, symbol: string): string { + return keccak256(defaultAbiCoder.encode(["string", "string"], [name, symbol])); + } +} diff --git a/packages/validator/src/utils/Errors.ts b/packages/validator/src/utils/Errors.ts new file mode 100644 index 0000000..cc3153b --- /dev/null +++ b/packages/validator/src/utils/Errors.ts @@ -0,0 +1,99 @@ +import { ContractUtils } from "./ContractUtils"; + +export class ResponseMessage { + static messages: Map = new Map([ + ["0000", "Success"], + ["1000", "Sender is not validator"], + ["1001", "Validator is not active"], + ["1002", "Validator is already active"], + ["1003", "Validator is already exist"], + ["1010", "The last validator cannot be removed"], + ["1020", "Not allowed deposit"], + ["1030", "Amount not multiple of gwei"], + ["1050", "Sender is not authorized to execute"], + ["1160", "ProvideLoyalty-This is a purchase data that has already been processed"], + ["1161", "ProvideLoyalty-Too much royalty paid"], + ["1162", "ProvideLoyalty-Registered validator does not exist"], + ["1163", "ProvideLoyalty-Too many validators have participated"], + ["1164", "ProvideLoyalty-Number of validators who participated did not satisfy the quorum"], + ["1170", "Currency-The arrangement is not equal in size"], + ["1171", "Currency-The validity of the data has expired."], + ["1172", "Currency-Registered validator does not exist"], + ["1173", "Currency-Too many validators have participated"], + ["1174", "Currency-Number of validators who participated did not satisfy the quorum"], + ["1200", "The shop ID already exists"], + ["1201", "The shop ID is not exists"], + ["1202", "The shop is not activated"], + ["1211", "This exchange rate is not supported"], + ["1220", "Insufficient withdrawal amount"], + ["1221", "Withdrawal is already opened"], + ["1222", "Withdrawal is not opened"], + ["1501", "Invalid signature"], + ["1502", "Unregistered phone number"], + ["1503", "Does not match registered wallet address"], + ["1505", "Invalid certifier signature"], + ["1510", "Insufficient foundation balance"], + ["1511", "Insufficient balance"], + ["1512", "Not allowed deposit"], + ["1513", "Insufficient fee or foundation balance"], + ["1514", "Insufficient liquidity balance"], + ["1520", "Loyalty type is not TOKEN"], + ["1521", "Invalid value entered"], + ["1530", "The payment ID already exists"], + ["1031", "The amount entered is less than the minimum amount"], + ["1531", "The status of the payment corresponding to the payment ID is not in progress"], + ["1532", "The status of the payment corresponding to the payment ID is not a cancellable condition"], + ["1533", "The status of the payment corresponding to the payment ID is not being cancelled"], + ["1534", "The period for cancellation of payment has expired"], + ["1711", "Already Exist Deposit"], + ["1712", "No Exist Withdraw"], + ["1715", "Already Confirm Withdraw"], + ["1717", "Does not match the address registered on the bridge"], + ["1718", "Does not match the amount registered on the bridge"], + ["2001", "Failed to check the validity of parameters"], + ["2002", "The access key entered is not valid"], + ["2003", "The payment ID is not exist"], + ["2020", "The status code for this payment cannot be approved"], + ["2022", "The status code for this payment cannot be cancel"], + ["2024", "The status code for this payment cannot process closing"], + ["2025", "This payment has already been approved"], + ["2026", "This payment has already been closed"], + ["2027", "This payment has already been approved and failed"], + ["2028", "The status code for this payment cannot be denied"], + ["2029", "This payment has forced to close"], + ["2030", "This payment cannot be closed before it is approved"], + ["2033", "The task ID is not exist"], + ["2040", "The status code for this task cannot be approved"], + ["4000", "Denied by user"], + ["5000", "Smart Contract Error"], + ["6000", "Server Error"], + ["7000", "Timeout period expired"], + ]); + + public static getEVMErrorMessage(error: any): { code: number; error: any } { + const code = ContractUtils.cacheEVMError(error); + const message = ResponseMessage.messages.get(code); + if (message !== undefined) { + return { code: Number(code), error: { message } }; + } + + if (ContractUtils.isErrorOfEVM(error)) { + const defaultCode = "5000"; + const defaultMessage = error.reason ? error.reason : ResponseMessage.messages.get(defaultCode); + if (defaultMessage !== undefined) { + return { code: Number(defaultCode), error: { message: defaultMessage } }; + } + } else if (error instanceof Error && error.message) { + return { code: 9000, error: { message: error.message.substring(0, 64) } }; + } + return { code: 9000, error: { message: "Unknown Error" } }; + } + + public static getErrorMessage(code: string, additional?: any): { code: number; error: any } { + const message = ResponseMessage.messages.get(code); + if (message !== undefined) { + return { code: Number(code), error: { message, ...additional } }; + } + return { code: 9000, error: { message: "Unknown Error" } }; + } +} diff --git a/packages/validator/src/utils/HTTPClient.ts b/packages/validator/src/utils/HTTPClient.ts new file mode 100644 index 0000000..bea6f4b --- /dev/null +++ b/packages/validator/src/utils/HTTPClient.ts @@ -0,0 +1,61 @@ +import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; +import { handleNetworkError } from "../network/ErrorTypes"; + +export class HTTPClient { + private client: AxiosInstance; + constructor() { + this.client = axios.create(); + } + + public get(url: string, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .get(url, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } + + public delete(url: string, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .delete(url, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } + + public post(url: string, data?: any, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .post(url, data, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } + + public put(url: string, data?: any, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .put(url, data, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } +} diff --git a/packages/validator/src/utils/Utils.ts b/packages/validator/src/utils/Utils.ts new file mode 100644 index 0000000..0b5f17c --- /dev/null +++ b/packages/validator/src/utils/Utils.ts @@ -0,0 +1,294 @@ +import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios"; +import process from "process"; +import { handleNetworkError } from "../network/ErrorTypes"; + +export class Utils { + /** + * Check whether the string is a integer. + * @param value + */ + public static isInteger(value: string): boolean { + return /^[+-]?([0-9]+)$/.test(value); + } + + /** + * Check whether the string is a positive integer. + * @param value + */ + public static isPositiveInteger(value: string): boolean { + return /^(\+)?([0-9]+)$/.test(value); + } + + /** + * Check whether the string is a negative integer. + * @param value + */ + public static isNegativeInteger(value: string): boolean { + return /^-([0-9]+)$/.test(value); + } + + /** + * Check whether the string is a positive. + * @param value + */ + public static isPositive(value: string): boolean { + return /^(\+)?[0-9]\d*(\.\d+)?$/.test(value); + } + + /** + * Check whether the string is a negative. + * @param value + */ + public static isNegative(value: string): boolean { + return /^-?[0-9]\d*(\.\d+)?$/.test(value); + } + + /** + * Gets the path to where the execution command was entered for this process. + */ + public static getInitCWD(): string { + // Get the working directory the user was in when the process was started, + // as opposed to the `cwd` exposed by node which is the program's path. + // Try to use `INIT_CWD` which is provided by npm, and fall back to + // `PWD` otherwise. + // See also: https://github.com/npm/cli/issues/2033 + if (process.env.INIT_CWD !== undefined) return process.env.INIT_CWD; + if (process.env.PWD !== undefined) return process.env.PWD; + return process.cwd(); + } + + /** + * Attach "0x" to the hexadecimal string. + * @param value The source hexadecimal string + */ + public static attachPrefixHex(value: string): string { + if (value.substring(0, 2).toLowerCase() === "0x") return value; + else return "0x" + value; + } + + /** + * Detach "0x" from the hexadecimal string. + * @param value The source hexadecimal string + */ + public static detachPrefixHex(value: string): string { + if (value.substring(0, 2).toLowerCase() === "0x") return value.substring(2); + else return value; + } + + public static getTimeStamp(): number { + return Math.floor(new Date().getTime() / 1000); + } + + public static delay(interval: number): Promise { + return new Promise((resolve, _) => { + setTimeout(resolve, interval); + }); + } +} + +/** + * A ArrayRange that goes through the numbers first, first + step, first + 2 * step, ..., up to and excluding end. + */ +export class ArrayRange { + /** + * The first value + */ + private readonly first: number; + + /** + * The last value + */ + private readonly last: number; + + /** + * The value to add to the current value at each iteration. + */ + private readonly step: number; + + /** + * Constructor + * @param n The starting value. + * @param p The value that serves as the stopping criterion. + * This value is not included in the range. + * @param q The value to add to the current value at each iteration. + */ + constructor(n: number, p?: number, q?: number) { + let begin = 0; + let end = 0; + let step = 1; + if (p === undefined && q === undefined) { + begin = 0; + end = n; + step = 1; + } else if (p !== undefined && q === undefined) { + begin = n; + end = p; + step = 1; + } else if (p !== undefined && q !== undefined) { + begin = n; + end = p; + step = q; + } + + if (begin === end || step === 0) { + this.first = begin; + this.last = begin; + this.step = 0; + return; + } + + if (begin < end && step > 0) { + this.first = begin; + this.last = end - 1; + this.last -= (this.last - this.first) % step; + this.step = step; + } else if (begin > end && step < 0) { + this.first = begin; + this.last = end + 1; + this.last += (this.first - this.last) % (0 - step); + this.step = step; + } else { + this.first = begin; + this.last = begin; + this.step = 0; + } + } + + /** + * Returns length + */ + public get length(): number { + if (this.step > 0) return 1 + (this.last - this.first) / this.step; + if (this.step < 0) return 1 + (this.first - this.last) / (0 - this.step); + return 0; + } + + /** + * Performs the specified action for each element in an array. + * @param callback A function that accepts up to three arguments. + * forEach calls the callback function one time for each element in the array. + */ + public forEach(callback: (value: number, index: number) => void) { + const length = this.length; + for (let idx = 0, value = this.first; idx < length; idx++, value += this.step) callback(value, idx); + } + + /** + * Calls a defined callback function on each element of an array, + * and returns an array that contains the results. + * @param callback A function that accepts up to three arguments. + * The map method calls the callback function one time for each element in the array. + */ + public map(callback: (value: number, index: number) => U): U[] { + const array: U[] = []; + const length = this.length; + for (let idx = 0, value = this.first; idx < length; idx++, value += this.step) array.push(callback(value, idx)); + return array; + } + + /** + * Returns the elements of an array that meet the condition specified in a callback function. + * @param callback A function that accepts up to three arguments. + * The filter method calls the callback function one time for each element in the array. + */ + public filter(callback: (value: number, index: number) => unknown): number[] { + const array: number[] = []; + const length = this.length; + for (let idx = 0, value = this.first; idx < length; idx++, value += this.step) + if (callback(value, idx)) array.push(value); + return array; + } + + /** + * Calls the specified callback function for all the elements in an array. + * The return value of the callback function is the accumulated result, + * and is provided as an argument in the next call to the callback function. + * @param callback A function that accepts up to four arguments. + * The reduce method calls the callback function one time for each element in the array. + * @param initialValue If initialValue is specified, + * it is used as the initial value to start the accumulation. + * The first call to the callback function provides this value as an argument instead of an array value. + * @returns The accumulated value + */ + public reduce( + callback: (previousValue: T, currentValue: number, currentIndex: number) => T, + initialValue: T + ): T { + let accumulator = initialValue; + const length = this.length; + for (let idx = 0, value = this.first; idx < length; idx++, value += this.step) + accumulator = callback(accumulator, value, idx); + return accumulator; + } +} + +/** + * Returns an ArrayRange of integers from 0 to n-1 + * @param begin The starting value. + * @param end The value that serves as the stopping criterion. + * This value is not included in the range. + * @param step The value to add to the current value at each iteration. + * @returns A ArrayRange that goes through the numbers begin, begin + step, begin + 2 * step, ..., up to and excluding end. + */ +export function iota(begin: number, end?: number, step?: number): ArrayRange { + return new ArrayRange(begin, end, step); +} + +export class HTTPClient { + private client: AxiosInstance; + constructor() { + this.client = axios.create(); + } + public get(url: string, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .get(url, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } + public delete(url: string, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .delete(url, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } + public post(url: string, data?: any, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .post(url, data, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } + public put(url: string, data?: any, config?: AxiosRequestConfig): Promise { + return new Promise((resolve, reject) => { + this.client + .put(url, data, config) + .then((response: AxiosResponse) => { + resolve(response); + }) + .catch((reason: any) => { + reject(handleNetworkError(reason)); + }); + }); + } +} + +(BigInt.prototype as any).toJSON = function () { + return this.toString(); +}; diff --git a/packages/validator/test/01-Collector.test.ts b/packages/validator/test/01-Collector.test.ts new file mode 100644 index 0000000..14100e4 --- /dev/null +++ b/packages/validator/test/01-Collector.test.ts @@ -0,0 +1,190 @@ +import "@nomiclabs/hardhat-ethers"; +import "@nomiclabs/hardhat-waffle"; +import "@nomiclabs/hardhat-web3"; +import "@openzeppelin/hardhat-upgrades"; + +import { Amount } from "../src/common/Amount"; +import { Config } from "../src/common/Config"; +import { ValidatorStorage } from "../src/storage/ValidatorStorage"; +import { ContractUtils } from "../src/utils/ContractUtils"; +import { BIP20DelegatedTransfer, Bridge } from "../typechain-types"; +import { Deployments } from "./helper/Deployments"; + +import chai, { expect } from "chai"; +import { solidity } from "ethereum-waffle"; + +import { Wallet } from "ethers"; + +// tslint:disable-next-line:no-implicit-dependencies +import { arrayify } from "@ethersproject/bytes"; +import { AddressZero, HashZero } from "@ethersproject/constants"; + +import * as hre from "hardhat"; + +import * as assert from "assert"; +import path from "path"; +import { EventCollector } from "../src/scheduler/EventCollector"; + +chai.use(solidity); + +interface IShopData { + shopId: string; + name: string; + currency: string; + wallet: Wallet; +} + +describe("Test for Ledger", () => { + const deployments = new Deployments(); + let tokenContract: BIP20DelegatedTransfer; + let bridgeContract: Bridge; + let config: Config; + let storage: ValidatorStorage; + + const amount = Amount.make(100_000, 18).value; + const fee = Amount.make(5, 18).value; + + let collector: EventCollector; + + const deployAllContract = async (shopData: IShopData[]) => { + await deployments.doDeployAll(); + tokenContract = deployments.getContract("TestKIOS") as BIP20DelegatedTransfer; + bridgeContract = deployments.getContract("Bridge") as Bridge; + }; + + before("Create Config", async () => { + config = new Config(); + config.readFromFile(path.resolve(process.cwd(), "config", "config_test.yaml")); + storage = await ValidatorStorage.make(config.database); + await storage.clearTestDB(); + }); + + after("Stop TestServer", async () => { + await storage.dropTestDB(); + }); + + let tokenId0: string; + let tokenId1: string; + let depositId: string; + it("Deploy", async () => { + await deployAllContract([]); + }); + + it("Create EventCollector", async () => { + collector = new EventCollector(config, storage, "hardhat", bridgeContract.address, 1n); + }); + + it("EventCollector.work()", async () => { + await collector.work(); + const events = await storage.getEvents("hardhat", 0n); + assert.deepStrictEqual(events.length, 0); + }); + + it("Register token", async () => { + // Native Token + tokenId0 = HashZero; + await bridgeContract.connect(deployments.accounts.deployer).registerToken(HashZero, AddressZero); + // BIP20 Token + tokenId1 = ContractUtils.getTokenId(await tokenContract.name(), await tokenContract.symbol()); + await bridgeContract.connect(deployments.accounts.deployer).registerToken(tokenId1, tokenContract.address); + }); + + it("Deposit Native Liquidity", async () => { + const liquidityAmount = Amount.make(1_000_000_000, 18).value; + const signature = await ContractUtils.signMessage(deployments.accounts.deployer, arrayify(HashZero)); + const tx1 = await bridgeContract + .connect(deployments.accounts.deployer) + .depositLiquidity(tokenId0, liquidityAmount, signature, { value: liquidityAmount }); + await tx1.wait(); + }); + + it("Deposit BIP20 Liquidity", async () => { + const liquidityAmount = Amount.make(1_000_000_000, 18).value; + const nonce = await (deployments.getContract("TestKIOS") as BIP20DelegatedTransfer).nonceOf( + deployments.accounts.deployer.address + ); + const message = ContractUtils.getTransferMessage( + deployments.accounts.deployer.address, + bridgeContract.address, + liquidityAmount, + nonce + ); + const signature = await ContractUtils.signMessage(deployments.accounts.deployer, message); + const tx1 = await bridgeContract + .connect(deployments.accounts.deployer) + .depositLiquidity(tokenId1, liquidityAmount, signature); + await tx1.wait(); + }); + + it("Deposit native token to Main Bridge", async () => { + const oldLiquidity = await hre.ethers.provider.getBalance(bridgeContract.address); + depositId = ContractUtils.getRandomId(deployments.accounts.users[0].address); + const signature = await ContractUtils.signMessage(deployments.accounts.users[0], arrayify(HashZero)); + await expect( + bridgeContract + .connect(deployments.accounts.users[0]) + .depositToBridge(tokenId0, depositId, AddressZero, 0, signature, { + value: amount, + }) + ) + .to.emit(bridgeContract, "BridgeDeposited") + .withNamedArgs({ + tokenId: tokenId0, + depositId, + account: deployments.accounts.users[0].address, + amount, + }); + expect(await hre.ethers.provider.getBalance(bridgeContract.address)).to.deep.equal(oldLiquidity.add(amount)); + }); + + it("EventCollector.work()", async () => { + await collector.work(); + const events = await storage.getEvents("hardhat", 0n); + assert.deepStrictEqual(events.length, 1); + assert.deepStrictEqual(events[0].network, "hardhat"); + assert.deepStrictEqual(events[0].tokenId, tokenId0); + assert.deepStrictEqual(events[0].depositId, depositId); + assert.deepStrictEqual(events[0].account, deployments.accounts.users[0].address); + assert.deepStrictEqual(events[0].amount, amount); + }); + + it("Deposit BIB20 token to Main Bridge", async () => { + const oldLiquidity = await tokenContract.balanceOf(bridgeContract.address); + const oldTokenBalance = await tokenContract.balanceOf(deployments.accounts.users[0].address); + const nonce = await tokenContract.nonceOf(deployments.accounts.users[0].address); + const message = ContractUtils.getTransferMessage( + deployments.accounts.users[0].address, + bridgeContract.address, + amount, + nonce + ); + depositId = ContractUtils.getRandomId(deployments.accounts.users[0].address); + const signature = await ContractUtils.signMessage(deployments.accounts.users[0], message); + await expect( + bridgeContract + .connect(deployments.accounts.deployer) + .depositToBridge(tokenId1, depositId, deployments.accounts.users[0].address, amount, signature) + ) + .to.emit(bridgeContract, "BridgeDeposited") + .withNamedArgs({ + depositId, + account: deployments.accounts.users[0].address, + amount, + }); + expect(await tokenContract.balanceOf(deployments.accounts.users[0].address)).to.deep.equal( + oldTokenBalance.sub(amount) + ); + expect(await tokenContract.balanceOf(bridgeContract.address)).to.deep.equal(oldLiquidity.add(amount)); + }); + + it("EventCollector.work()", async () => { + await collector.work(); + const events = await storage.getEvents("hardhat", 0n); + assert.deepStrictEqual(events.length, 2); + assert.deepStrictEqual(events[1].network, "hardhat"); + assert.deepStrictEqual(events[1].tokenId, tokenId1); + assert.deepStrictEqual(events[1].depositId, depositId); + assert.deepStrictEqual(events[1].account, deployments.accounts.users[0].address); + assert.deepStrictEqual(events[1].amount, amount); + }); +}); diff --git a/packages/validator/test/helper/Deployments.ts b/packages/validator/test/helper/Deployments.ts new file mode 100644 index 0000000..3689d3e --- /dev/null +++ b/packages/validator/test/helper/Deployments.ts @@ -0,0 +1,200 @@ +import "@nomiclabs/hardhat-ethers"; +import "@nomiclabs/hardhat-waffle"; +import "@openzeppelin/hardhat-upgrades"; +import { ethers, upgrades } from "hardhat"; + +import { BaseContract, Wallet } from "ethers"; + +import { Amount, BOACoin } from "../../src/common/Amount"; +import { HardhatAccount } from "../../src/HardhatAccount"; +import { Bridge, BridgeValidator, TestKIOS } from "../../typechain-types"; + +interface IShopData { + shopId: string; + name: string; + currency: string; + wallet: Wallet; +} + +interface IDeployedContract { + name: string; + address: string; + contract: BaseContract; +} + +export interface IAccount { + deployer: Wallet; + fee: Wallet; + bridgeValidators: Wallet[]; + users: Wallet[]; + shops: Wallet[]; +} + +type FnDeployer = (accounts: IAccount, deployment: Deployments) => void; + +export class Deployments { + public deployments: Map; + public accounts: IAccount; + + constructor() { + this.deployments = new Map(); + + const raws = HardhatAccount.keys.map((m) => new Wallet(m, ethers.provider)); + const [ + deployer, + fee, + bridgeValidator1, + bridgeValidator2, + bridgeValidator3, + bridgeValidator4, + bridgeValidator5, + user01, + user02, + user03, + user04, + user05, + user06, + user07, + user08, + user09, + user10, + shop01, + shop02, + shop03, + shop04, + shop05, + shop06, + shop07, + shop08, + shop09, + shop10, + ] = raws; + + this.accounts = { + deployer, + fee, + bridgeValidators: [ + bridgeValidator1, + bridgeValidator2, + bridgeValidator3, + bridgeValidator4, + bridgeValidator5, + ], + users: [user01, user02, user03, user04, user05, user06, user07, user08, user09, user10], + shops: [shop01, shop02, shop03, shop04, shop05, shop06, shop07, shop08, shop09, shop10], + }; + } + + public addContract(name: string, address: string, contract: BaseContract) { + this.deployments.set(name, { + name, + address, + contract, + }); + } + + public getContract(name: string): BaseContract | undefined { + const info = this.deployments.get(name); + if (info !== undefined) { + return info.contract; + } else { + return undefined; + } + } + + public getContractAddress(name: string): string | undefined { + const info = this.deployments.get(name); + if (info !== undefined) { + return info.address; + } else { + return undefined; + } + } + + public async doDeployAll() { + const deployers: FnDeployer[] = [deployToken, deployBridgeValidator, deployBridge]; + for (const elem of deployers) { + try { + await elem(this.accounts, this); + } catch (error) { + console.log(error); + } + } + } +} + +async function deployToken(accounts: IAccount, deployment: Deployments) { + const contractName = "TestKIOS"; + console.log(`Deploy ${contractName}...`); + + const factory = await ethers.getContractFactory("TestKIOS"); + const contract = (await factory.connect(accounts.deployer).deploy(accounts.deployer.address)) as TestKIOS; + await contract.deployed(); + await contract.deployTransaction.wait(); + + const balance = await contract.balanceOf(accounts.deployer.address); + console.log(`TestKIOS token's owner: ${accounts.deployer.address}`); + console.log(`TestKIOS token's balance of owner: ${new BOACoin(balance).toDisplayString(true, 2)}`); + + deployment.addContract(contractName, contract.address, contract); + console.log(`Deployed ${contractName} to ${contract.address}`); + + { + const userAmount = Amount.make(200_000, 18); + const tx2 = await contract.connect(accounts.deployer).multiTransfer( + accounts.users.map((m) => m.address), + userAmount.value + ); + console.log(`Transfer token to users (tx: ${tx2.hash})...`); + await tx2.wait(); + + const tx3 = await contract.connect(accounts.deployer).multiTransfer( + accounts.shops.map((m) => m.address), + userAmount.value + ); + console.log(`Transfer token to shops (tx: ${tx3.hash})...`); + await tx3.wait(); + } +} + +async function deployBridgeValidator(accounts: IAccount, deployment: Deployments) { + const contractName = "BridgeValidator"; + console.log(`Deploy ${contractName}...`); + + const factory = await ethers.getContractFactory("BridgeValidator"); + const contract = (await upgrades.deployProxy( + factory.connect(accounts.deployer), + [accounts.bridgeValidators.map((m) => m.address), 2], + { + initializer: "initialize", + kind: "uups", + } + )) as BridgeValidator; + await contract.deployed(); + await contract.deployTransaction.wait(); + deployment.addContract(contractName, contract.address, contract); + console.log(`Deployed ${contractName} to ${contract.address}`); +} + +async function deployBridge(accounts: IAccount, deployment: Deployments) { + const contractName = "Bridge"; + console.log(`Deploy ${contractName}...`); + + if (deployment.getContract("BridgeValidator") === undefined || deployment.getContract("TestKIOS") === undefined) { + console.error("Contract is not deployed!"); + return; + } + const factory = await ethers.getContractFactory("Bridge"); + const contract = (await upgrades.deployProxy( + factory.connect(accounts.deployer), + [await deployment.getContractAddress("BridgeValidator"), accounts.fee.address], + { + initializer: "initialize", + kind: "uups", + } + )) as Bridge; + await contract.deployed(); + await contract.deployTransaction.wait(); + deployment.addContract(contractName, contract.address, contract); + console.log(`Deployed ${contractName} to ${contract.address}`); +} diff --git a/packages/validator/tsconfig.json b/packages/validator/tsconfig.json new file mode 100644 index 0000000..5ae8ce3 --- /dev/null +++ b/packages/validator/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "outDir": "dist", + "declaration": true, + "resolveJsonModule": true + }, + "include": ["./scripts", "./src", "./test", "./typechain-types"], + "files": ["./hardhat.config.ts"] +} diff --git a/packages/validator/tslint.json b/packages/validator/tslint.json new file mode 100644 index 0000000..bc4f679 --- /dev/null +++ b/packages/validator/tslint.json @@ -0,0 +1,35 @@ +{ + "extends": ["tslint:latest", "tslint-config-prettier"], + "linterOptions": { + "exclude": ["node_modules/**/*."] + }, + "rules": { + "no-console": false, + "member-access": false, + "object-literal-sort-keys": false, + "ordered-imports": true, + "interface-name": false, + "strict-null-checks": false, + "semicolon": true, + "trailing-comma": [ + true, + { + "singleline": "never", + "multiline": { + "objects": "always", + "arrays": "always", + "functions": "never", + "typeLiterals": "ignore" + } + } + ], + "quotemark": [true, "double"], + "no-trailing-whitespace": [true, "ignore-comments"], + "max-classes-per-file": [false, 1], + "prefer-conditional-expression": false, + "no-bitwise": false, + "variable-name": [true, "allow-leading-underscore", "allow-pascal-case", "allow-snake-case", "check-format"], + "no-implicit-dependencies": [true, "dev"] + }, + "rulesDirectory": [] +} diff --git a/yarn.lock b/yarn.lock index c3d2f48..6c88bf8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -57,6 +57,11 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -64,6 +69,15 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@ethereum-waffle/chai@4.0.10": version "4.0.10" resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" @@ -138,7 +152,7 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.3" -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": +"@ethereumjs/common@2.6.5", "@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": version "2.6.5" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== @@ -170,7 +184,7 @@ "@ethereumjs/common" "^2.6.0" ethereumjs-util "^7.1.3" -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": +"@ethereumjs/tx@3.5.2", "@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": version "3.5.2" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== @@ -293,7 +307,7 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -309,6 +323,15 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" +"@ethersproject/experimental@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/experimental/-/experimental-5.7.0.tgz#9759639434d37beaedfd8acab6f3af7db246b92d" + integrity sha512-DWvhuw7Dg8JPyhMbh/CNYOwsTLjXRx/HGkacIL5rBocG8jJC0kmixwoK/J3YblO4vtcyBLMa+sV74RJZK2iyHg== + dependencies: + "@ethersproject/web" "^5.7.0" + ethers "^5.7.0" + scrypt-js "3.0.1" + "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" @@ -403,7 +426,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.0": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -487,7 +510,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -511,7 +534,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -905,6 +928,18 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== +"@nomiclabs/hardhat-web3@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz#2d9850cb285a2cebe1bd718ef26a9523542e52a9" + integrity sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q== + dependencies: + "@types/bignumber.js" "^5.0.0" + +"@opentelemetry/api@^1.4.0": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.8.0.tgz#5aa7abb48f23f693068ed2999ae627d2f7d902ec" + integrity sha512-I/s6F7yKUDdtMsoBWXJe8Qz40Tui5vsuKCWJEWVL+5q9sSWRzzx6v2KeNsOBEwd94j0eWkpWCH4yB6rZg9Mf0w== + "@openzeppelin/contracts-upgradeable@^4.9.5": version "4.9.5" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.5.tgz#572b5da102fc9be1d73f34968e0ca56765969812" @@ -1131,6 +1166,11 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@smithy/types@^2.10.0": version "2.10.0" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.10.0.tgz#1cc16e3c04d56c49ecb88efa1b7fa9ca3a90d667" @@ -1162,6 +1202,20 @@ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.18.0.tgz#8e77a02a09ecce957255a2f48c9a7178ec191908" integrity sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA== +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" @@ -1216,6 +1270,18 @@ resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz#db2cf364c159fb1f12be6cd3549f56387eaf8d73" integrity sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg== +"@types/argparse@^2.0.2": + version "2.0.15" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-2.0.15.tgz#e9992a67c221362fbdfed53a86499ac9eb2a640b" + integrity sha512-eQLf4VsDUX8z2JNRwgdQ8s3pwIogZ5JEFaDcren6B8pDECNjbED+WqJC2FH6fAnXrIvS8vy0BBp4hYHkRNSlQA== + +"@types/bignumber.js@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/bignumber.js/-/bignumber.js-5.0.0.tgz#d9f1a378509f3010a3255e9cc822ad0eeb4ab969" + integrity sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA== + dependencies: + bignumber.js "*" + "@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -1223,13 +1289,31 @@ dependencies: "@types/node" "*" -"@types/bn.js@^5.1.0": +"@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": version "5.1.5" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== dependencies: "@types/node" "*" +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/chai@4", "@types/chai@^4.3.5": version "4.3.12" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.12.tgz#b192fe1c553b54f45d20543adc2ab88455a07d5e" @@ -1242,11 +1326,25 @@ dependencies: "@types/node" "*" +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + "@types/cookiejar@*": version "2.1.5" resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.5.tgz#14a3e83fa641beb169a2dd8422d91c3c345a9a78" integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== +"@types/cors@^2.8.8": + version "2.8.17" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + "@types/debug@^4.1.9": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -1259,6 +1357,31 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/express-serve-static-core@^4.17.33": + version "4.17.43" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" + integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.8": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/extend@^3.0.1": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/extend/-/extend-3.0.4.tgz#5f9aa502299e1b9beb9ade57ea9e36898de0ff52" + integrity sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA== + "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -1274,6 +1397,35 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/ip@^1.1.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/ip/-/ip-1.1.3.tgz#5d8634b3514a51768adda5e17c91a11cdb2e5247" + integrity sha512-64waoJgkXFTYnCYDUWgSATJ/dXEBanVkaP5d4Sbk7P6U7cTTMhxVyROTckc6JKdwCrgnAjZMn0k3177aQxtDEA== + dependencies: + "@types/node" "*" + +"@types/js-yaml@^4.0.5": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + "@types/level-errors@*": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.2.tgz#f33ec813c50780b547463da9ad8acac89ee457d9" @@ -1293,6 +1445,16 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/mime@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" @@ -1315,6 +1477,11 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/node-cron@^3.0.1": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.11.tgz#70b7131f65038ae63cfe841354c8aba363632344" + integrity sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg== + "@types/node-fetch@^2.6.1": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -1340,7 +1507,7 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.20.43": +"@types/node@^12.12.6", "@types/node@^12.20.43": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== @@ -1357,16 +1524,35 @@ dependencies: "@types/node" "*" +"@types/pg@^8.10.7": + version "8.11.2" + resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.11.2.tgz#e5c306601d2e0cc54c0801cc61a41761c8a95c92" + integrity sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw== + dependencies: + "@types/node" "*" + pg-protocol "*" + pg-types "^4.0.1" + "@types/prettier@^2.1.1": version "2.7.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== +"@types/qs@*": + version "6.9.12" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.12.tgz#afa96b383a3a6fdc859453a1892d41b607fc7756" + integrity sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg== + "@types/qs@^6.2.31": version "6.9.11" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + "@types/readable-stream@^2.3.13": version "2.3.15" resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" @@ -1375,6 +1561,13 @@ "@types/node" "*" safe-buffer "~5.1.1" +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + "@types/secp256k1@^4.0.1": version "4.0.6" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf" @@ -1387,6 +1580,23 @@ resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + "@types/superagent@4.1.13": version "4.1.13" resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.13.tgz#0aaa3f4ff9404b94932d1dcdfb7f3d39d23997a0" @@ -1395,6 +1605,16 @@ "@types/cookiejar" "*" "@types/node" "*" +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@types/urijs@^1.19.12": + version "1.19.25" + resolved "https://registry.yarnpkg.com/@types/urijs/-/urijs-1.19.25.tgz#ac92b53e674c3b108decdbe88dc5f444a2f42f6a" + integrity sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1405,6 +1625,11 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== +abortcontroller-polyfill@^1.7.5: + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== + abstract-leveldown@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" @@ -1439,6 +1664,14 @@ abstract-leveldown@~6.2.1: level-supports "~1.0.0" xtend "~4.0.0" +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + acorn-walk@^8.1.1: version "8.3.2" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" @@ -1611,6 +1844,11 @@ array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1696,6 +1934,11 @@ async-eventemitter@^0.2.4: dependencies: async "^2.4.0" +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async-retry@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" @@ -1715,6 +1958,11 @@ async@^2.4.0: dependencies: lodash "^4.17.14" +async@^3.2.3: + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1758,12 +2006,21 @@ axios@^1.4.0, axios@^1.5.1: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.7: + version "1.6.8" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" + integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2: +base-x@^3.0.2, base-x@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -1792,7 +2049,7 @@ bigint-crypto-utils@^3.2.2: resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== -bignumber.js@^9.0.0: +bignumber.js@*, bignumber.js@^9.0.0: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== @@ -1802,6 +2059,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bintrees@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.2.tgz#49f896d6e858a4a499df85c38fb399b9aff840f8" + integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== + bip39@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" @@ -1817,12 +2079,17 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== +bluebird@^3.5.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, 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== @@ -1832,6 +2099,24 @@ bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +body-parser@1.20.2, body-parser@^1.16.0, body-parser@^1.19.0: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + boxen@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" @@ -1911,6 +2196,16 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== + +buffer-writer@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" + integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1932,7 +2227,7 @@ buffer@4.9.2: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -1955,6 +2250,13 @@ bufferutil@4.0.5: dependencies: node-gyp-build "^4.3.0" +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1965,6 +2267,29 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^6.0.4: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" @@ -2094,11 +2419,27 @@ chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cids@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== + dependencies: + buffer "^5.5.0" + class-is "^1.1.0" + multibase "~0.6.0" + multicodec "^1.0.0" + multihashes "~0.4.15" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2107,6 +2448,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +class-is@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -2136,7 +2482,23 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -color-convert@^1.9.0: +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2155,16 +2517,40 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2207,7 +2593,7 @@ commander@^10.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -commander@^2.12.1: +commander@^2.12.1, commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2242,6 +2628,37 @@ concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-hash@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== + dependencies: + cids "^0.7.1" + multicodec "^0.5.5" + multihashes "^0.4.15" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" @@ -2267,6 +2684,14 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cors@^2.8.1, cors@^2.8.5: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + cosmiconfig@^8.0.0: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" @@ -2310,11 +2735,26 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983" + integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g== + dependencies: + node-fetch "^2.6.12" + "crypt@>= 0.0.1": version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2327,6 +2767,13 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -2334,13 +2781,6 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: dependencies: ms "2.1.2" -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2353,6 +2793,25 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" @@ -2370,6 +2829,11 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -2406,6 +2870,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + dezalgo@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" @@ -2438,6 +2907,21 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== + +dom-parser@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/dom-parser/-/dom-parser-1.1.5.tgz#cba785f2235e769750996ae3d35d08b9f35f82d8" + integrity sha512-lCiFG48ZUzGXjKN0qhSkxD/i3ndyV6I37zQ3W2VFYLjF1ob8A+QgSsM7Ps2UT0d3LpJxLMmMHiJJ34z5hkKLiA== + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + dotenv@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" @@ -2451,6 +2935,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -2464,6 +2953,19 @@ elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.4.0: + version "6.5.5" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" + integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + 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" + emittery@0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" @@ -2474,6 +2976,16 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + encoding-down@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" @@ -2484,6 +2996,13 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enquirer@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -2497,6 +3016,11 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + errno@~0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -2595,11 +3119,48 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== + dependencies: + d "^1.0.2" + ext "^1.7.0" + escalade@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -2622,6 +3183,16 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2647,6 +3218,19 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eth-ens-namehash@2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + eth-gas-reporter@^0.2.25: version "0.2.27" resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" @@ -2666,6 +3250,27 @@ eth-gas-reporter@^0.2.25: sha1 "^1.1.1" sync-request "^6.0.0" +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@^0.1.26: + version "0.1.29" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + nano-json-stream-parser "^0.1.2" + servify "^0.1.12" + ws "^3.0.0" + xhr-request-promise "^0.1.2" + ethereum-bloom-filters@^1.0.6: version "1.0.10" resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" @@ -2769,7 +3374,7 @@ ethereumjs-util@^7.0.3, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.7.2: +ethers@^5.7.0, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2857,6 +3462,19 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -2865,7 +3483,68 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -extend@~3.0.2: +expo-server-sdk@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/expo-server-sdk/-/expo-server-sdk-3.7.0.tgz#65249f8d4a7797507cc884d61222c3c5a3863127" + integrity sha512-SMZuBiIWejAdMMIOTjGQlprcwvSyLfeUQlooyGB5q6GvZ8zHjp+if8Q4k7xczUBTqIqTzs5IvTZnTiqA9Oe9WA== + dependencies: + node-fetch "^2.6.0" + promise-limit "^2.7.0" + promise-retry "^2.0.1" + +express-validator@^6.14.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/express-validator/-/express-validator-6.15.0.tgz#5e4601428960b0d66f5f4ae09cb32ed2077374a4" + integrity sha512-r05VYoBL3i2pswuehoFSy+uM8NBuVaY7avp5qrYjQBDzagx2Z5A77FZqPT8/gNLF3HopWkIzaTFaC4JysWXLqg== + dependencies: + lodash "^4.17.21" + validator "^13.9.0" + +express@^4.14.0, express@^4.17.1: + version "4.18.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.3.tgz#6870746f3ff904dee1819b82e4b51509afffb0d4" + integrity sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.2" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -2928,6 +3607,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -2935,6 +3619,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -2962,11 +3659,21 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.15.4: version "1.15.5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== +follow-redirects@^1.15.6: + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2979,6 +3686,11 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== +form-data-encoder@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== + form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -3016,6 +3728,11 @@ formidable@^2.1.2: once "^1.4.0" qs "^6.11.0" +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -3026,6 +3743,11 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -3037,6 +3759,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -3065,6 +3796,13 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -3148,6 +3886,23 @@ get-port@^3.1.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== +get-stdin@=8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" @@ -3253,6 +4008,14 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globalthis@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" @@ -3281,6 +4044,42 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" +got@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== + dependencies: + "@sindresorhus/is" "^4.6.0" + "@szmarczak/http-timer" "^5.0.1" + "@types/cacheable-request" "^6.0.2" + "@types/responselike" "^1.0.0" + cacheable-lookup "^6.0.4" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + form-data-encoder "1.7.1" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^2.0.0" + +got@^11.8.5: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -3311,6 +4110,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hardhat-change-network@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/hardhat-change-network/-/hardhat-change-network-0.0.7.tgz#9f9b7943ff966515658b70bf5e44bc2f073af402" + integrity sha512-Usp9fJan9SOJnOlVcv/jMJDchseE7bIDA5ZsBnracgVk4MiBwkvMqpmLWn5G1aDBvnUCthvS2gO3odfahgkV0Q== + hardhat-gas-reporter@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz#ebe5bda5334b5def312747580cd923c2b09aef1b" @@ -3473,6 +4277,13 @@ hosted-git-info@^2.6.0: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +html-parse-stringify@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + http-basic@^8.1.1: version "8.1.3" resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" @@ -3483,6 +4294,11 @@ http-basic@^8.1.1: http-response-object "^3.0.1" parse-cache-control "^1.0.1" +http-cache-semantics@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -3494,6 +4310,11 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + http-response-object@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" @@ -3510,6 +4331,22 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -3525,6 +4362,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -3607,6 +4451,16 @@ ip-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw== +ip@^1.1.5: + version "1.1.9" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396" + integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-arguments@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -3628,6 +4482,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -3689,6 +4548,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -3760,6 +4624,11 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.7" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -3781,7 +4650,7 @@ is-typed-array@^1.1.13, is-typed-array@^1.1.3: dependencies: which-typed-array "^1.1.14" -is-typedarray@~1.0.0: +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -3846,12 +4715,17 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== +js-sha3@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.x, js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.13.1, js-yaml@^3.14.0: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -3878,6 +4752,11 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" @@ -3967,6 +4846,13 @@ keccak@^3.0.0, keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -3979,6 +4865,11 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + level-codec@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" @@ -4109,7 +5000,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4122,6 +5013,18 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logform@^2.3.2, logform@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loupe@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" @@ -4129,12 +5032,22 @@ loupe@^2.3.6: dependencies: get-func-name "^2.0.1" -loyalty-tokens@^1.0.6: +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + +loyalty-tokens@^1.0.5, loyalty-tokens@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/loyalty-tokens/-/loyalty-tokens-1.0.6.tgz#8d3c4de7b034e4e9648dc924dcf4504d658d1bb0" integrity sha512-t55ypKkfdlMUBbdrGfyHVzAy+l6bAFeziNQA1O/ptIeCMRGy5Z09CvrgXwALC90uGpIWNnN5Y8O9inL6DSRk9w== -lru-cache@^10.0.0: +lru-cache@^10.0.0, lru-cache@^10.1.0: version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== @@ -4194,6 +5107,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + memdown@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" @@ -4211,6 +5129,11 @@ memorystream@^0.3.1: resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge2@^1.2.3, merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -4228,7 +5151,7 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" -methods@^1.1.2: +methods@^1.1.2, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== @@ -4259,18 +5182,40 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mime@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + 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" @@ -4307,7 +5252,34 @@ minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.3: +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== + dependencies: + mkdirp "*" + +mkdirp@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mkdirp@0.5.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -4379,6 +5351,21 @@ mocha@^10.0.0, mocha@^10.2.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" +mock-fs@^4.1.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + +moment@^2.29.1: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +moo@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4394,6 +5381,64 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multibase@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multicodec@^0.5.5: + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== + dependencies: + varint "^5.0.0" + +multicodec@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== + dependencies: + buffer "^5.6.0" + varint "^5.0.0" + +multihashes@^0.4.15, multihashes@~0.4.15: + version "0.4.21" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== + dependencies: + buffer "^5.5.0" + multibase "^0.7.0" + varint "^5.0.0" + +multisig-wallet-contracts@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multisig-wallet-contracts/-/multisig-wallet-contracts-1.1.0.tgz#680b28bdbf9b2860bb853abdbe2b5910b1b0dfee" + integrity sha512-dJCxmOBqZZicKjshiC9SS17XPZJWSU/FpZ8eCw1WWTH08jjMudRaKMtJ/l0pjadFRUQ/wDhCUInIixoGhHyCyg== + +mybatis-mapper@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/mybatis-mapper/-/mybatis-mapper-0.7.1.tgz#f4c1c3e5ba2af590e4d8dbe49b5b9b0151e4af10" + integrity sha512-th02VMccSBASUsx9tDS4y9lNfCIUZHzX7UPudvuh6heuyJ37UEeFDIHxPNWcqkmt0TPAX/+nK6jaNH9WBnAnKQ== + dependencies: + html-parse-stringify "3.0.1" + sql-formatter "12.2.4" + +nano-json-stream-parser@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== + nanoid@3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" @@ -4404,16 +5449,43 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +nearley@^2.20.1: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + 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-cron@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.3.tgz#c4bc7173dd96d96c50bdb51122c64415458caff2" + integrity sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A== + dependencies: + uuid "8.3.2" + node-emoji@^1.10.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -4421,7 +5493,7 @@ node-emoji@^1.10.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -4460,6 +5532,16 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +ntp-time@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/ntp-time/-/ntp-time-2.0.4.tgz#e04f464b1b64dab76bcc341c60f9e45d1be40d10" + integrity sha512-tC7ejWGWdYhUzqQEeWiJZxHYPuUK/zCLXfY7DWGxa2/IBABk+LikpesUHg9aOBsboT84ebcptHgtaLJSCnSeZg== + number-to-bn@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" @@ -4473,7 +5555,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.0: +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4511,13 +5593,39 @@ obliterator@^2.0.0: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== -once@1.x, once@^1.3.0, once@^1.4.0: +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + dependencies: + http-https "^1.0.0" + +obuf@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -4535,6 +5643,16 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -4575,6 +5693,11 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== +packet-reader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" + integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4587,6 +5710,11 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -4597,6 +5725,11 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -4622,6 +5755,11 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -4648,6 +5786,91 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.5.0, pg-connection-string@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-numeric@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" + integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== + +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== + +pg-protocol@*, pg-protocol@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" + integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg-types@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.2.tgz#399209a57c326f162461faa870145bb0f918b76d" + integrity sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng== + dependencies: + pg-int8 "1.0.1" + pg-numeric "1.0.2" + postgres-array "~3.0.1" + postgres-bytea "~3.0.0" + postgres-date "~2.1.0" + postgres-interval "^3.0.0" + postgres-range "^1.1.1" + +pg@^8.11.3, pg@^8.9.0: + version "8.11.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" + integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.6.2" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + +pgtools@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pgtools/-/pgtools-1.0.1.tgz#5a5206157b1ea65bf0003a28a524ddd29025db26" + integrity sha512-an+ztelmf7MAaSuQhpuwRlwdgOB4mlkQ9Kv3Vh3Ij9fnJqF3pG8defU+gM3Ig4x9LsFC1eV0vHaEFkxvOQjVKQ== + dependencies: + pg "^8.9.0" + pg-connection-string "^2.5.0" + yargs "^17.7.1" + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -4668,6 +5891,55 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-array@~3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" + integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-bytea@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" + integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== + dependencies: + obuf "~1.1.2" + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-date@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0" + integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + +postgres-interval@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" + integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== + +postgres-range@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.4.tgz#a59c5f9520909bcec5e63e8cf913a92e4c952863" + integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -4692,6 +5964,32 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prom-client@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-15.1.0.tgz#816a4a2128da169d0471093baeccc6d2f17a4613" + integrity sha512-cCD7jLTqyPdjEPBo/Xk4Iu8jxjuZgZJ3e/oET3L+ZwOuap/7Cw3dH/TJSsZKs1TQLZ2IHpIlRAKw82ef06kmMw== + dependencies: + "@opentelemetry/api" "^1.4.0" + tdigest "^0.1.1" + +promise-limit@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/promise-limit/-/promise-limit-2.7.0.tgz#eb5737c33342a030eaeaecea9b3d3a93cb592b26" + integrity sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + promise@^8.0.0: version "8.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" @@ -4708,6 +6006,14 @@ proper-lockfile@^4.1.1: retry "^0.12.0" signal-exit "^3.0.2" +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -4723,6 +6029,19 @@ psl@^1.1.28: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -4733,6 +6052,13 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + qs@^6.11.0, qs@^6.11.2, qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" @@ -4745,11 +6071,38 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== + +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4757,7 +6110,12 @@ randombytes@^2.0.1, randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -raw-body@^2.4.1: +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.2, raw-body@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -4839,7 +6197,7 @@ req-from@^2.0.0: dependencies: resolve-from "^3.0.0" -request@^2.85.0: +request@^2.79.0, request@^2.85.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -4875,6 +6233,11 @@ require-from-string@^2.0.0, require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -4906,6 +6269,18 @@ resolve@^1.1.6, resolve@^1.17.0, resolve@^1.3.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + retry@0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" @@ -5000,7 +6375,7 @@ safe-array-concat@^1.1.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5019,6 +6394,11 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -5044,7 +6424,7 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -5085,6 +6465,25 @@ semver@^7.3.4, semver@^7.3.8, semver@^7.5.2, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -5092,6 +6491,27 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +servify@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== + dependencies: + body-parser "^1.16.0" + cors "^2.8.1" + express "^4.14.0" + request "^2.79.0" + xhr "^2.3.3" + set-function-length@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.1.tgz#47cc5945f2c771e2cf261c6737cf9684a2a5e425" @@ -5164,6 +6584,27 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5178,6 +6619,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +smart-buffer@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -5301,11 +6747,25 @@ sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sql-formatter@12.2.4: + version "12.2.4" + resolved "https://registry.yarnpkg.com/sql-formatter/-/sql-formatter-12.2.4.tgz#1671b2a5c40a87414281e2483108a24f98e8a556" + integrity sha512-Qj45LEHSfgrdYDOrAtIkR8SdS10SWcqCIM2WZwQwMKF2v9sM0K2dlThWPS7eYCUrhttZIrU1WwuIwHk7MjsWOw== + dependencies: + argparse "^2.0.1" + get-stdin "=8.0.0" + nearley "^2.20.1" + sshpk@^1.7.0: version "1.18.0" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" @@ -5321,6 +6781,11 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -5333,6 +6798,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -5471,6 +6941,23 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swarm-js@^0.1.40: + version "0.1.42" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^11.8.5" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request "^1.0.1" + sync-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" @@ -5508,6 +6995,31 @@ table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" +tar@^4.0.2: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + +tdigest@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.2.tgz#96c64bac4ff10746b910b0e23b515794e12faced" + integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== + dependencies: + bintrees "1.0.2" + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5530,6 +7042,11 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5562,6 +7079,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" @@ -5691,6 +7213,19 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + typechain@^8.0.0, typechain@^8.1.0: version "8.3.2" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" @@ -5751,6 +7286,13 @@ typed-array-length@^1.0.4: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -5776,6 +7318,11 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -5813,7 +7360,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -5825,6 +7372,16 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urijs@^1.19.7: + version "1.19.11" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" + integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== + +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== + url@^0.11.0: version "0.11.3" resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" @@ -5840,6 +7397,13 @@ utf-8-validate@5.0.7: dependencies: node-gyp-build "^4.3.0" +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + utf8@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" @@ -5861,21 +7425,46 @@ util@^0.12.5: is-typed-array "^1.1.3" which-typed-array "^1.1.2" +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@8.3.2, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: 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== +validator@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-13.11.0.tgz#23ab3fd59290c61248364eabf4067f04955fbb1b" + integrity sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ== + +varint@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -5885,7 +7474,215 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -web3-utils@^1.3.6: +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + +web3-bzz@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.10.4.tgz#dcc787970767d9004c73d11d0eeef774ce16b880" + integrity sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw== + dependencies: + "@types/node" "^12.12.6" + got "12.1.0" + swarm-js "^0.1.40" + +web3-core-helpers@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz#bd2b4140df2016d5dd3bb2b925fc29ad8678677c" + integrity sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g== + dependencies: + web3-eth-iban "1.10.4" + web3-utils "1.10.4" + +web3-core-method@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.10.4.tgz#566b52f006d3cbb13b21b72b8d2108999bf5d6bf" + integrity sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.10.4" + web3-core-promievent "1.10.4" + web3-core-subscriptions "1.10.4" + web3-utils "1.10.4" + +web3-core-promievent@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz#629b970b7934430b03c5033c79f3bb3893027e22" + integrity sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz#eb1f147e6b9df84e3a37e602162f8925bdb4bb9a" + integrity sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg== + dependencies: + util "^0.12.5" + web3-core-helpers "1.10.4" + web3-providers-http "1.10.4" + web3-providers-ipc "1.10.4" + web3-providers-ws "1.10.4" + +web3-core-subscriptions@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz#2f4dcb404237e92802a563265d11a33934dc38e6" + integrity sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.4" + +web3-core@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.10.4.tgz#639de68b8b9871d2dc8892e0dd4e380cb1361a98" + integrity sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww== + dependencies: + "@types/bn.js" "^5.1.1" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.10.4" + web3-core-method "1.10.4" + web3-core-requestmanager "1.10.4" + web3-utils "1.10.4" + +web3-eth-abi@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz#16c19d0bde0aaf8c1a56cb7743a83156d148d798" + integrity sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.10.4" + +web3-eth-accounts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz#df30e85a7cd70e475f8cf52361befba408829e34" + integrity sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg== + dependencies: + "@ethereumjs/common" "2.6.5" + "@ethereumjs/tx" "3.5.2" + "@ethereumjs/util" "^8.1.0" + eth-lib "0.2.8" + scrypt-js "^3.0.1" + uuid "^9.0.0" + web3-core "1.10.4" + web3-core-helpers "1.10.4" + web3-core-method "1.10.4" + web3-utils "1.10.4" + +web3-eth-contract@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz#22d39f04e11d9ff4e726e8025a56d78e843a2c3d" + integrity sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A== + dependencies: + "@types/bn.js" "^5.1.1" + web3-core "1.10.4" + web3-core-helpers "1.10.4" + web3-core-method "1.10.4" + web3-core-promievent "1.10.4" + web3-core-subscriptions "1.10.4" + web3-eth-abi "1.10.4" + web3-utils "1.10.4" + +web3-eth-ens@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz#3d991adac52bc8e598f1f1b8528337fa6291004c" + integrity sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.10.4" + web3-core-helpers "1.10.4" + web3-core-promievent "1.10.4" + web3-eth-abi "1.10.4" + web3-eth-contract "1.10.4" + web3-utils "1.10.4" + +web3-eth-iban@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz#bc61b4a1930d19b1df8762c606d669902558e54d" + integrity sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw== + dependencies: + bn.js "^5.2.1" + web3-utils "1.10.4" + +web3-eth-personal@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz#e2ee920f47e84848288e03442659cdbb2c4deea2" + integrity sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.10.4" + web3-core-helpers "1.10.4" + web3-core-method "1.10.4" + web3-net "1.10.4" + web3-utils "1.10.4" + +web3-eth@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.10.4.tgz#3a908c635cb5d935bd30473e452f3bd7f2ee66a5" + integrity sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA== + dependencies: + web3-core "1.10.4" + web3-core-helpers "1.10.4" + web3-core-method "1.10.4" + web3-core-subscriptions "1.10.4" + web3-eth-abi "1.10.4" + web3-eth-accounts "1.10.4" + web3-eth-contract "1.10.4" + web3-eth-ens "1.10.4" + web3-eth-iban "1.10.4" + web3-eth-personal "1.10.4" + web3-net "1.10.4" + web3-utils "1.10.4" + +web3-net@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.10.4.tgz#20e12c60e4477d4298979d8d5d66b9abf8e66a09" + integrity sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow== + dependencies: + web3-core "1.10.4" + web3-core-method "1.10.4" + web3-utils "1.10.4" + +web3-providers-http@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.10.4.tgz#ca7aa58aeaf8123500c24ffe0595896319f830e8" + integrity sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ== + dependencies: + abortcontroller-polyfill "^1.7.5" + cross-fetch "^4.0.0" + es6-promise "^4.2.8" + web3-core-helpers "1.10.4" + +web3-providers-ipc@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz#2e03437909e4e7771d646ff05518efae44b783c3" + integrity sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.10.4" + +web3-providers-ws@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz#55d0c3ba36c6a79d105f02e20a707eb3978e7f82" + integrity sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.10.4" + websocket "^1.0.32" + +web3-shh@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.10.4.tgz#9852d6f3d05678e31e49235a60fea10ca7a9e21d" + integrity sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw== + dependencies: + web3-core "1.10.4" + web3-core-method "1.10.4" + web3-core-subscriptions "1.10.4" + web3-net "1.10.4" + +web3-utils@1.10.4, web3-utils@^1.3.6: version "1.10.4" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.4.tgz#0daee7d6841641655d8b3726baf33b08eda1cbec" integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== @@ -5899,11 +7696,36 @@ web3-utils@^1.3.6: randombytes "^2.1.0" utf8 "3.0.0" +web3@^1.7.3: + version "1.10.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.10.4.tgz#5d5e59b976eaf758b060fe1a296da5fe87bdc79c" + integrity sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA== + dependencies: + web3-bzz "1.10.4" + web3-core "1.10.4" + web3-eth "1.10.4" + web3-eth-personal "1.10.4" + web3-net "1.10.4" + web3-shh "1.10.4" + web3-utils "1.10.4" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -5948,6 +7770,32 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +winston-transport@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" + integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== + dependencies: + logform "^2.3.2" + readable-stream "^3.6.0" + triple-beam "^1.3.0" + +winston@^3.3.3: + version "3.12.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.12.0.tgz#a5d965a41d3dc31be5408f8c66e927958846c0d0" + integrity sha512-OwbxKaOlESDi01mC9rkM0dQqQt2I8DAUMRLZ/HpbwvDXm85IryEHgoogy5fziQy38PntgZsLlhAYHz//UPHZ5w== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.4.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.7.0" + word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -5990,12 +7838,51 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + ws@^7.4.6: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.0.1, xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr@^2.0.4, xhr@^2.3.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -6005,7 +7892,12 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -6015,6 +7907,14 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml-env-defaults@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/yaml-env-defaults/-/yaml-env-defaults-1.1.6.tgz#f39565371cd0c30235c86827d5d068501db4b808" + integrity sha512-+mBP6tTkBhfDsnt8BOFpcnQJbLzmJdivMDk+JVcv1d0NoLOg/4dpMOT34ZWMQgcCK1iLQqU5dTNuaha/atlElg== + dependencies: + js-yaml "^3.14.0" + lodash "^4.17.20" + yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -6025,6 +7925,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -6048,6 +7953,19 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.7.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"