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"