diff --git a/.dockerignore b/.dockerignore index b919e1d011..27e04d0e0b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -31,7 +31,7 @@ go/enclave/main/main tools/walletextension/main/main tools/walletextension/main/wallet_extension tools/networkmanager/main/main -tools/obscuroscan/main/main +tools/tenscan/main/main **/node_modules/ **/dist .git diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 4d0fe8f8b8..db01164a33 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -42,8 +42,9 @@ jobs: integration/.build/wallet_extension/wal-ext-*.txt integration/.build/eth2/* integration/.build/faucet/* - integration/.build/obscuroscan/* + integration/.build/tenscan/* integration/.build/tengateway/* + integration/.build/contractdeployer/* integration/.build/smartcontracts/* retention-days: 1 diff --git a/.github/workflows/manual-deploy-obscuro-scan-2.yml b/.github/workflows/manual-deploy-obscuro-scan-2.yml deleted file mode 100644 index aea11d479e..0000000000 --- a/.github/workflows/manual-deploy-obscuro-scan-2.yml +++ /dev/null @@ -1,85 +0,0 @@ -# Deploys Obscuro Scan on Azure for Testnet -# Builds the Obscuro Scan image, pushes the image to dockerhub and starts the Obscuro Scan on Azure - -name: '[M] Deploy Obscuro Scan 2 Testnet' -run-name: '[M] Deploy Obscuro Scan Testnet ( ${{ github.event.inputs.testnet_type }} )' -on: - workflow_dispatch: - inputs: - testnet_type: - description: 'Testnet Type' - required: true - default: 'dev-testnet' - type: choice - options: - - 'dev-testnet' - - 'uat-testnet' - - 'sepolia-testnet' - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - environment: - name: ${{ github.event.inputs.testnet_type }} - steps: - - name: 'Print GitHub variables' - # This is a useful record of what the environment variables were at the time the job ran, for debugging and reference - run: | - echo "GitHub Variables = ${{ toJSON(vars) }}" - - - uses: actions/checkout@v3 - - - name: 'Set up Docker' - uses: docker/setup-buildx-action@v1 - - - name: 'Login to Azure docker registry' - uses: azure/docker-login@v1 - with: - login-server: testnetobscuronet.azurecr.io - username: testnetobscuronet - password: ${{ secrets.REGISTRY_PASSWORD }} - - - name: 'Login via Azure CLI' - uses: azure/login@v1 - with: - creds: ${{ secrets.AZURE_CREDENTIALS }} - - - name: Build and Push Docker FE Image - run: | - DOCKER_BUILDKIT=1 docker build -t ${{ vars.DOCKER_BUILD_TAG_SCAN_FE }} -f ./tools/obscuroscan_v2/frontend/Dockerfile . - docker push ${{ vars.DOCKER_BUILD_TAG_SCAN_FE }} - - - name: Build and Push Docker API Image - run: | - DOCKER_BUILDKIT=1 docker build -t ${{ vars.DOCKER_BUILD_TAG_SCAN_API }} -f ./tools/obscuroscan_v2/backend/Dockerfile . - docker push ${{ vars.DOCKER_BUILD_TAG_SCAN_API }} - - - name: 'Deploy FE to Azure Container Instances' - uses: 'azure/aci-deploy@v1' - with: - resource-group: ${{ secrets.RESOURCE_GROUP }} - dns-name-label: ${{ github.event.inputs.testnet_type }}-obscuro-scan - image: ${{ vars.DOCKER_BUILD_TAG_SCAN_FE }} - name: ${{ github.event.inputs.testnet_type }}-fe-obscuro-scan - location: 'uksouth' - restart-policy: 'Never' - environment-variables: VITE_APIHOSTADDRESS=https://${{ github.event.inputs.testnet_type }}-api.obscuroscan.io VITE_FE_VERSION=${{ GITHUB.RUN_NUMBER }}-${{ GITHUB.SHA }} - command-line: npm run serve-prod - ports: '80' - cpu: 2 - memory: 2 - - - name: 'Deploy API to Azure Container Instances' - uses: 'azure/aci-deploy@v1' - with: - resource-group: ${{ secrets.RESOURCE_GROUP }} - dns-name-label: ${{ github.event.inputs.testnet_type }}-api-obscuro-scan - image: ${{ vars.DOCKER_BUILD_TAG_SCAN_API }} - name: ${{ github.event.inputs.testnet_type }}-api-obscuro-scan - location: 'uksouth' - restart-policy: 'Never' - command-line: ./cmd/backend --nodeHostAddress http://${{ vars.L2_RPC_URL_VALIDATOR }}:80 --serverAddress 0.0.0.0:80 - ports: '80' - cpu: 2 - memory: 2 - diff --git a/.gitignore b/.gitignore index e57a7bf2d8..c9c85f15f0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,7 +35,7 @@ tools/walletextension/main/main tools/walletextension/bin/** tools/walletextension/main/wallet_extension tools/networkmanager/main/main -tools/obscuroscan/main/main +tools/tenscan/main/main integration/eth2network/main/main @@ -44,7 +44,7 @@ integration/eth2network/main/main **/enclave_logs.txt **/host_logs.txt **/wallet_extension_logs.txt -**/obscuroscan_logs.txt +**/tenscan_logs.txt # Temp env files testnet/.env diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 1c7f50e2a6..9b425affa1 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -58,8 +58,8 @@ sidebar-list: - title: Tools children: - - title: ObscuroScan - url: testnet/obscuroscan + - title: Tenscan + url: testnet/tenscan - title: Token Faucet url: testnet/faucet diff --git a/docs/_docs/testnet/deploying-a-smart-contract.md b/docs/_docs/testnet/deploying-a-smart-contract.md index a74c0c532d..d549a6aa58 100644 --- a/docs/_docs/testnet/deploying-a-smart-contract.md +++ b/docs/_docs/testnet/deploying-a-smart-contract.md @@ -48,4 +48,4 @@ Congratulations, your smart contract is now deployed to Ten Testnet! Because Ten provides full privacy, the details of your transaction are encrypted and only visible to you, as the holder of your wallet's private key. -Now head over to the [TenScan page](https://docs.obscu.ro/testnet/obscuroscan/) to see how you can view the transaction details. +Now head over to the [TenScan page](https://docs.obscu.ro/testnet/tenscan/) to see how you can view the transaction details. diff --git a/go/common/httputil/httputil.go b/go/common/httputil/httputil.go index de8a97ae53..85e7bf4f38 100644 --- a/go/common/httputil/httputil.go +++ b/go/common/httputil/httputil.go @@ -66,7 +66,7 @@ func ExecuteHTTPReq(client *http.Client, req *http.Request) ([]byte, error) { return body, nil } -// EnableCORS Allows Obscuroscan and WalletExtension APIs to serve other web apps via CORS. +// EnableCORS Allows Tenscan and WalletExtension APIs to serve other web apps via CORS. func EnableCORS(resp http.ResponseWriter, req *http.Request) bool { resp.Header().Set(CorsAllowOrigin, OriginAll) if (*req).Method == ReqOptions { diff --git a/go/common/log/log.go b/go/common/log/log.go index 5b82607f0b..56aac0078b 100644 --- a/go/common/log/log.go +++ b/go/common/log/log.go @@ -41,7 +41,7 @@ const ( WalletExtCmp = "wallet_extension" TestGethNetwCmp = "test_geth_network" EthereumL1Cmp = "l1_host" - ObscuroscanCmp = "obscuroscan" + TenscanCmp = "tenscan" CrossChainCmp = "cross_chain" ) diff --git a/go/host/container/host_container.go b/go/host/container/host_container.go index e065e611d6..118955db78 100644 --- a/go/host/container/host_container.go +++ b/go/host/container/host_container.go @@ -26,14 +26,14 @@ import ( ) const ( - APIVersion1 = "1.0" - APINamespaceObscuro = "obscuro" - APINamespaceEth = "eth" - APINamespaceObscuroScan = "obscuroscan" - APINamespaceScan = "scan" - APINamespaceNetwork = "net" - APINamespaceTest = "test" - APINamespaceDebug = "debug" + APIVersion1 = "1.0" + APINamespaceObscuro = "obscuro" + APINamespaceEth = "eth" + APINamespaceTenScan = "tenscan" + APINamespaceScan = "scan" + APINamespaceNetwork = "net" + APINamespaceTest = "test" + APINamespaceDebug = "debug" ) type HostContainer struct { @@ -173,9 +173,9 @@ func NewHostContainer(cfg *config.HostConfig, services *host.ServicesRegistry, p Public: true, }, { - Namespace: APINamespaceObscuroScan, + Namespace: APINamespaceTenScan, Version: APIVersion1, - Service: clientapi.NewObscuroScanAPI(h), + Service: clientapi.NewTenScanAPI(h), Public: true, }, { diff --git a/go/host/rpc/clientapi/client_api_obscuroscan.go b/go/host/rpc/clientapi/client_api_obscuroscan.go index 153e5846de..41fa61cf74 100644 --- a/go/host/rpc/clientapi/client_api_obscuroscan.go +++ b/go/host/rpc/clientapi/client_api_obscuroscan.go @@ -16,19 +16,19 @@ import ( const txLimit = 100 -// ObscuroScanAPI implements ObscuroScan-specific JSON RPC operations. -type ObscuroScanAPI struct { +// TenScanAPI implements TenScan-specific JSON RPC operations. +type TenScanAPI struct { host host.Host } -func NewObscuroScanAPI(host host.Host) *ObscuroScanAPI { - return &ObscuroScanAPI{ +func NewTenScanAPI(host host.Host) *TenScanAPI { + return &TenScanAPI{ host: host, } } // GetBlockHeaderByHash returns the header for the block with the given hash. -func (api *ObscuroScanAPI) GetBlockHeaderByHash(blockHash gethcommon.Hash) (*types.Header, error) { +func (api *TenScanAPI) GetBlockHeaderByHash(blockHash gethcommon.Hash) (*types.Header, error) { blockHeader, err := api.host.DB().GetBlockByHash(blockHash) if err != nil { if errors.Is(err, errutil.ErrNotFound) { @@ -41,12 +41,12 @@ func (api *ObscuroScanAPI) GetBlockHeaderByHash(blockHash gethcommon.Hash) (*typ // GetBatch returns the batch with the given hash. Unlike `EthereumAPI.GetBlockByHash()`, returns the full // `ExtBatch`, and not just the header. -func (api *ObscuroScanAPI) GetBatch(batchHash gethcommon.Hash) (*common.ExtBatch, error) { +func (api *TenScanAPI) GetBatch(batchHash gethcommon.Hash) (*common.ExtBatch, error) { return api.host.DB().GetBatch(batchHash) } // GetBatchForTx returns the batch containing a given transaction hash. -func (api *ObscuroScanAPI) GetBatchForTx(txHash gethcommon.Hash) (*common.ExtBatch, error) { +func (api *TenScanAPI) GetBatchForTx(txHash gethcommon.Hash) (*common.ExtBatch, error) { batchNumber, err := api.host.DB().GetBatchNumber(txHash) if err != nil { return nil, fmt.Errorf("could not retrieve batch containing a transaction with hash %s. Cause: %w", txHash, err) @@ -62,7 +62,7 @@ func (api *ObscuroScanAPI) GetBatchForTx(txHash gethcommon.Hash) (*common.ExtBat // GetLatestTransactions returns the hashes of the latest `num` transactions confirmed in batches (or all the // transactions if there are less than `num` total transactions). -func (api *ObscuroScanAPI) GetLatestTransactions(num int) ([]gethcommon.Hash, error) { +func (api *TenScanAPI) GetLatestTransactions(num int) ([]gethcommon.Hash, error) { // We prevent someone from requesting an excessive amount of transactions. if num > txLimit { return nil, fmt.Errorf("cannot request more than 100 latest transactions") @@ -105,11 +105,11 @@ func (api *ObscuroScanAPI) GetLatestTransactions(num int) ([]gethcommon.Hash, er } // GetTotalTransactions returns the number of recorded transactions on the network. -func (api *ObscuroScanAPI) GetTotalTransactions() (*big.Int, error) { +func (api *TenScanAPI) GetTotalTransactions() (*big.Int, error) { return api.host.DB().GetTotalTransactions() } // Attestation returns the node's attestation details. -func (api *ObscuroScanAPI) Attestation() (*common.AttestationReport, error) { +func (api *TenScanAPI) Attestation() (*common.AttestationReport, error) { return api.host.EnclaveClient().Attestation() } diff --git a/go/rpc/client.go b/go/rpc/client.go index 768ffaa126..b9db9052a1 100644 --- a/go/rpc/client.go +++ b/go/rpc/client.go @@ -26,12 +26,12 @@ const ( Health = "obscuro_health" Config = "obscuro_config" - GetBlockHeaderByHash = "obscuroscan_getBlockHeaderByHash" - GetBatch = "obscuroscan_getBatch" - GetBatchForTx = "obscuroscan_getBatchForTx" - GetLatestTxs = "obscuroscan_getLatestTransactions" - GetTotalTxs = "obscuroscan_getTotalTransactions" - Attestation = "obscuroscan_attestation" + GetBlockHeaderByHash = "tenscan_getBlockHeaderByHash" + GetBatch = "tenscan_getBatch" + GetBatchForTx = "tenscan_getBatchForTx" + GetLatestTxs = "tenscan_getLatestTransactions" + GetTotalTxs = "tenscan_getTotalTransactions" + Attestation = "tenscan_attestation" StopHost = "test_stopHost" Subscribe = "eth_subscribe" Unsubscribe = "eth_unsubscribe" diff --git a/integration/contractdeployer/contract_deployer_test.go b/integration/contractdeployer/contract_deployer_test.go index 93785918e7..7fd64f6fa7 100644 --- a/integration/contractdeployer/contract_deployer_test.go +++ b/integration/contractdeployer/contract_deployer_test.go @@ -38,7 +38,7 @@ const ( func init() { //nolint:gochecknoinits testlog.Setup(&testlog.Cfg{ LogDir: testLogs, - TestType: "noderunner", + TestType: "contractdeployer", TestSubtype: "test", LogLevel: log.LvlInfo, }) diff --git a/integration/obscurogateway/tengateway_test.go b/integration/obscurogateway/tengateway_test.go index 9c38b4f8ce..901241036e 100644 --- a/integration/obscurogateway/tengateway_test.go +++ b/integration/obscurogateway/tengateway_test.go @@ -103,6 +103,8 @@ func TestTenGateway(t *testing.T) { } // Gracefully shutdown + // todo remove this sleep when tests stabilize + time.Sleep(20 * time.Second) err = tenGwContainer.Stop() assert.NoError(t, err) } diff --git a/integration/obscuroscan/obscuroscan_test.go b/integration/obscuroscan/obscuroscan_test.go index 4d0ecf0589..b9b82e1c29 100644 --- a/integration/obscuroscan/obscuroscan_test.go +++ b/integration/obscuroscan/obscuroscan_test.go @@ -10,6 +10,9 @@ import ( "testing" "time" + "github.com/ten-protocol/go-ten/tools/tenscan/backend/config" + "github.com/ten-protocol/go-ten/tools/tenscan/backend/container" + gethcommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" @@ -19,8 +22,6 @@ import ( "github.com/ten-protocol/go-ten/go/rpc" "github.com/ten-protocol/go-ten/go/wallet" "github.com/ten-protocol/go-ten/integration/datagenerator" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend/config" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend/container" "github.com/valyala/fasthttp" "github.com/ethereum/go-ethereum/log" @@ -36,31 +37,31 @@ import ( func init() { //nolint:gochecknoinits testlog.Setup(&testlog.Cfg{ LogDir: testLogs, - TestType: "obscuroscan", + TestType: "tenscan", TestSubtype: "test", LogLevel: log.LvlInfo, }) } const ( - testLogs = "../.build/obscuroscan/" + testLogs = "../.build/tenscan/" ) -func TestObscuroscan(t *testing.T) { +func TestTenscan(t *testing.T) { startPort := integration.StartPortTenscanUnitTest createObscuroNetwork(t, startPort) - obsScanConfig := &config.Config{ + tenScanConfig := &config.Config{ NodeHostAddress: fmt.Sprintf("http://127.0.0.1:%d", startPort+integration.DefaultHostRPCHTTPOffset), ServerAddress: fmt.Sprintf("127.0.0.1:%d", startPort+integration.DefaultTenscanHTTPPortOffset), LogPath: "sys_out", } - serverAddress := fmt.Sprintf("http://%s", obsScanConfig.ServerAddress) + serverAddress := fmt.Sprintf("http://%s", tenScanConfig.ServerAddress) - obsScanContainer, err := container.NewObscuroScanContainer(obsScanConfig) + tenScanContainer, err := container.NewTenScanContainer(tenScanConfig) require.NoError(t, err) - err = obsScanContainer.Start() + err = tenScanContainer.Start() require.NoError(t, err) // wait for the msg bus contract to be deployed @@ -182,7 +183,7 @@ func TestObscuroscan(t *testing.T) { assert.NotEqual(t, configFetchObj.Item.SequencerID, gethcommon.Address{}) // Gracefully shutdown - err = obsScanContainer.Stop() + err = tenScanContainer.Stop() assert.NoError(t, err) } diff --git a/integration/simulation/p2p/in_mem_obscuro_client.go b/integration/simulation/p2p/in_mem_obscuro_client.go index d597832a88..30e1072115 100644 --- a/integration/simulation/p2p/in_mem_obscuro_client.go +++ b/integration/simulation/p2p/in_mem_obscuro_client.go @@ -33,7 +33,7 @@ type inMemObscuroClient struct { obscuroAPI *clientapi.ObscuroAPI ethAPI *clientapi.EthereumAPI filterAPI *clientapi.FilterAPI - obscuroScanAPI *clientapi.ObscuroScanAPI + tenScanAPI *clientapi.TenScanAPI testAPI *clientapi.TestAPI enclavePublicKey *ecies.PublicKey } @@ -51,7 +51,7 @@ func NewInMemObscuroClient(hostContainer *container.HostContainer) rpc.Client { obscuroAPI: clientapi.NewObscuroAPI(hostContainer.Host()), ethAPI: clientapi.NewEthereumAPI(hostContainer.Host(), logger), filterAPI: clientapi.NewFilterAPI(hostContainer.Host(), logger), - obscuroScanAPI: clientapi.NewObscuroScanAPI(hostContainer.Host()), + tenScanAPI: clientapi.NewTenScanAPI(hostContainer.Host()), testAPI: clientapi.NewTestAPI(hostContainer), enclavePublicKey: enclPubKey, } @@ -277,7 +277,7 @@ func (c *inMemObscuroClient) health(result interface{}) error { } func (c *inMemObscuroClient) getTotalTransactions(result interface{}) error { - totalTxs, err := c.obscuroScanAPI.GetTotalTransactions() + totalTxs, err := c.tenScanAPI.GetTotalTransactions() if err != nil { return fmt.Errorf("`%s` call failed. Cause: %w", rpc.GetTotalTxs, err) } @@ -295,7 +295,7 @@ func (c *inMemObscuroClient) getLatestTransactions(result interface{}, args []in return fmt.Errorf("first arg to %s is of type %T, expected type int", rpc.GetLatestTxs, args[0]) } - latestTxs, err := c.obscuroScanAPI.GetLatestTransactions(numTxs) + latestTxs, err := c.tenScanAPI.GetLatestTransactions(numTxs) if err != nil { return fmt.Errorf("`%s` call failed. Cause: %w", rpc.GetLatestTxs, err) } @@ -313,7 +313,7 @@ func (c *inMemObscuroClient) getBatchForTx(result interface{}, args []interface{ return fmt.Errorf("first arg to %s is of type %T, expected type int", rpc.GetBatchForTx, args[0]) } - batch, err := c.obscuroScanAPI.GetBatchForTx(txHash) + batch, err := c.tenScanAPI.GetBatchForTx(txHash) if err != nil { return fmt.Errorf("`%s` call failed. Cause: %w", rpc.GetBatchForTx, err) } @@ -331,7 +331,7 @@ func (c *inMemObscuroClient) getBatch(result interface{}, args []interface{}) er return fmt.Errorf("first arg to %s is of type %T, expected type int", rpc.GetBatch, args[0]) } - batch, err := c.obscuroScanAPI.GetBatch(batchHash) + batch, err := c.tenScanAPI.GetBatch(batchHash) if err != nil { return fmt.Errorf("`%s` call failed. Cause: %w", rpc.GetBatch, err) } diff --git a/integration/simulation/validate_chain.go b/integration/simulation/validate_chain.go index 3f5db642ea..30bbcf5425 100644 --- a/integration/simulation/validate_chain.go +++ b/integration/simulation/validate_chain.go @@ -56,7 +56,7 @@ func checkNetworkValidity(t *testing.T, s *Simulation) { l1MaxHeight := checkEthereumBlockchainValidity(t, s) checkObscuroBlockchainValidity(t, s, l1MaxHeight) checkReceivedLogs(t, s) - checkObscuroscan(t, s) + checkTenscan(t, s) } // Ensures that L1 and L2 txs were actually issued. @@ -719,8 +719,8 @@ func assertNoDupeLogs(t *testing.T, logs []*types.Log) { } } -// Checks that the various APIs powering Obscuroscan are working correctly. -func checkObscuroscan(t *testing.T, s *Simulation) { +// Checks that the various APIs powering Tenscan are working correctly. +func checkTenscan(t *testing.T, s *Simulation) { for idx, client := range s.RPCHandles.RPCClients { checkTotalTransactions(t, client, idx) latestTxHashes := checkLatestTxs(t, client, idx) diff --git a/testnet/docker-compose.local.yml b/testnet/docker-compose.local.yml index b7f0e86aad..3e065b38eb 100644 --- a/testnet/docker-compose.local.yml +++ b/testnet/docker-compose.local.yml @@ -24,11 +24,11 @@ services: build: context: $ROOT_PATH dockerfile: ./dockerfiles/enclave.debug.Dockerfile - obscuro-scan: - image: "testnetobscuronet.azurecr.io/obscuronet/obscuroscan:latest" + ten-scan: + image: "testnetobscuronet.azurecr.io/obscuronet/tenscan:latest" build: context: $ROOT_PATH - dockerfile: ./tools/obscuroscan/Dockerfile + dockerfile: ./tools/tenscan/backend/Dockerfile hardhat-deployer: image: "testnetobscuronet.azurecr.io/obscuronet/hardhatdeployer:latest" build: diff --git a/testnet/testnet-local-build_images.sh b/testnet/testnet-local-build_images.sh index 8eadb57f1d..b1651a83d9 100755 --- a/testnet/testnet-local-build_images.sh +++ b/testnet/testnet-local-build_images.sh @@ -48,7 +48,7 @@ command docker build -t testnetobscuronet.azurecr.io/obscuronet/host:latest -f " command docker build -t testnetobscuronet.azurecr.io/obscuronet/hardhatdeployer:latest -f "${tools_path}/hardhatdeployer/Dockerfile" "${root_path}" & command docker build -t testnetobscuronet.azurecr.io/obscuronet/enclave:latest --build-arg TESTMODE=true -f "${root_path}/dockerfiles/enclave.Dockerfile" "${root_path}" & command docker build -t testnetobscuronet.azurecr.io/obscuronet/enclave_debug:latest -f "${root_path}/dockerfiles/enclave.debug.Dockerfile" "${root_path}" & -command docker build -t testnetobscuronet.azurecr.io/obscuronet/obscuroscan:latest -f "${tools_path}/obscuroscan/Dockerfile" "${root_path}" & +command docker build -t testnetobscuronet.azurecr.io/obscuronet/tenscan:latest -f "${tools_path}/tenscan/Dockerfile" "${root_path}" & command docker build -t testnetobscuronet.azurecr.io/obscuronet/faucet:latest -f "${tools_path}/faucet/Dockerfile" "${root_path}" & command docker build -t testnetobscuronet.azurecr.io/obscuronet/obscuro_gateway:latest -f "${tools_path}/walletextension/Dockerfile" "${root_path}" & diff --git a/tools/obscuroscan/Dockerfile b/tools/obscuroscan/Dockerfile deleted file mode 100644 index fbfc48370a..0000000000 --- a/tools/obscuroscan/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -# Build Stages: -# system = prepares the "OS" by downloading required binaries -# get-dependencies = downloads the go modules using the prepared system -# build-obscuroscan = copies over the source code and builds the binaries using a compiler cache -# final = copies over only the executables in an alpine image that doesn't have any additional load. - -FROM golang:1.20-alpine3.18 as system - -# set the base libs to build / run -RUN apk add build-base bash git -ENV CGO_ENABLED=1 - -# Standard build stage that initializes the go dependencies -FROM system as get-dependencies -# create the base directory -# setup container data structure -RUN mkdir -p /home/obscuro/go-obscuro - -# Ensures container layer caching when dependencies are not changed -WORKDIR /home/obscuro/go-obscuro -COPY go.mod . -COPY go.sum . -RUN go mod download - -FROM get-dependencies as build-obscuroscan -# make sure the geth network code is available -COPY . /home/obscuro/go-obscuro - -# build the contract deployer exec -WORKDIR /home/obscuro/go-obscuro/tools/obscuroscan/main -RUN --mount=type=cache,target=/root/.cache/go-build \ - go build - -FROM alpine:3.18 - -COPY --from=build-obscuroscan /home/obscuro/go-obscuro/tools/obscuroscan/main /home/obscuro/go-obscuro/tools/obscuroscan/main -WORKDIR /home/obscuro/go-obscuro diff --git a/tools/obscuroscan/README.md b/tools/obscuroscan/README.md deleted file mode 100644 index 45ca80af22..0000000000 --- a/tools/obscuroscan/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# TenScan - -See the documentation [here](https://docs.obscu.ro/testnet/obscuroscan.html). - -## Developer notes diff --git a/tools/obscuroscan/container_run.sh b/tools/obscuroscan/container_run.sh deleted file mode 100755 index 9eda45090e..0000000000 --- a/tools/obscuroscan/container_run.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash - -# -# This script starts up the obscuroscan server -# - -help_and_exit() { - echo "" - echo "Usage: $(basename "${0}") --rpcServerAddress=http://validator-host:13010 --receivingPort=80" - echo "" - echo " rpcServerAddress *Optional* Set the rpc server address (defaults to http://validator-host:13010)" - echo "" - echo " receivingPort *Optional* Set the ObscuroScan server receiving port (defaults to 80)" - echo "" - echo "" - echo "" - exit 1 # Exit with error explicitly -} -# Ensure any fail is loud and explicit -set -euo pipefail - -# Define local usage vars -start_path="$(cd "$(dirname "${0}")" && pwd)" -testnet_path="${start_path}" - -# Define defaults -receivingPort=80 -rpcServerAddress='http://validator-host:13010' -docker_image="testnetobscuronet.azurecr.io/obscuronet/obscuroscan:latest" - -# Fetch options -for argument in "$@" -do - key=$(echo $argument | cut -f1 -d=) - value=$(echo $argument | cut -f2 -d=) - - case "$key" in - --rpcServerAddress) rpcServerAddress=${value} ;; - --receivingPort) receivingPort=${value} ;; - --image) docker_image=${value} ;; - --help) help_and_exit ;; - *) - esac -done - -# ensure required fields -if [[ -z ${rpcServerAddress:-} || -z ${receivingPort:-} ]]; -then - help_and_exit -fi - -# start the container -echo "Starting the obscuroscan server..." -docker network create --driver bridge node_network || true -docker run --name=obscuroscan \ - --detach \ - --network=node_network \ - -p $receivingPort:$receivingPort \ - --entrypoint /home/obscuro/go-obscuro/tools/obscuroscan/main/main \ - "${docker_image}" \ - --address='0.0.0.0:'$receivingPort \ - --rpcServerAddress=${rpcServerAddress} -echo "" diff --git a/tools/obscuroscan/main/cli.go b/tools/obscuroscan/main/cli.go deleted file mode 100644 index 33988f9af6..0000000000 --- a/tools/obscuroscan/main/cli.go +++ /dev/null @@ -1,54 +0,0 @@ -package main - -import ( - "flag" -) - -const ( - // Flag names and usages. - nodeIDName = "nodeID" - nodeIDUsage = "The 20 bytes of the node's address" - - rpcServerAddrName = "rpcServerAddress" - rpcServerAddrUsage = "The address on which to send RPC requests" - - addressName = "address" - addressUsage = "The address to serve Obscuroscan on" - - logPathName = "logPath" - logPathUsage = "The path to use for Obscuroscan's log file" -) - -type obscuroscanConfig struct { - nodeID string - rpcServerAddr string - address string - logPath string -} - -func defaultObscuroClientConfig() obscuroscanConfig { - return obscuroscanConfig{ - nodeID: "", - rpcServerAddr: "http://erpc.sepolia-testnet.obscu.ro:80", - address: "127.0.0.1:3000/v1", - logPath: "obscuroscan_logs.txt", - } -} - -func parseCLIArgs() obscuroscanConfig { - defaultConfig := defaultObscuroClientConfig() - - nodeID := flag.String(nodeIDName, defaultConfig.nodeID, nodeIDUsage) - rpcServerAddr := flag.String(rpcServerAddrName, defaultConfig.rpcServerAddr, rpcServerAddrUsage) - address := flag.String(addressName, defaultConfig.address, addressUsage) - logPath := flag.String(logPathName, defaultConfig.logPath, logPathUsage) - - flag.Parse() - - return obscuroscanConfig{ - nodeID: *nodeID, - rpcServerAddr: *rpcServerAddr, - address: *address, - logPath: *logPath, - } -} diff --git a/tools/obscuroscan/main/main.go b/tools/obscuroscan/main/main.go deleted file mode 100644 index b7a17408df..0000000000 --- a/tools/obscuroscan/main/main.go +++ /dev/null @@ -1,24 +0,0 @@ -package main - -import ( - "fmt" - - gethlog "github.com/ethereum/go-ethereum/log" - "github.com/ten-protocol/go-ten/go/common/log" - - "github.com/ten-protocol/go-ten/tools/obscuroscan" -) - -func main() { - config := parseCLIArgs() - - server := obscuroscan.NewObscuroscan( - config.rpcServerAddr, - log.New(log.ObscuroscanCmp, int(gethlog.LvlInfo), config.logPath), - ) - go server.Serve(config.address) - fmt.Printf("Obscuroscan started.\n💡 Visit %s to monitor the Obscuro network.\n", config.address) - - defer server.Shutdown() - select {} -} diff --git a/tools/obscuroscan/obscuroscan.go b/tools/obscuroscan/obscuroscan.go deleted file mode 100644 index 32c2d53b11..0000000000 --- a/tools/obscuroscan/obscuroscan.go +++ /dev/null @@ -1,548 +0,0 @@ -package obscuroscan - -import ( - "bytes" - "context" - "crypto/aes" - "crypto/cipher" - "embed" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "io/fs" - "math/big" - "net/http" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - "time" - - "github.com/ten-protocol/go-ten/go/common/compression" - - "github.com/edgelesssys/ego/enclave" - "github.com/ethereum/go-ethereum/accounts/abi" - gethcommon "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - gethlog "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/rlp" - "github.com/ten-protocol/go-ten/go/common" - "github.com/ten-protocol/go-ten/go/common/httputil" - "github.com/ten-protocol/go-ten/go/common/log" - "github.com/ten-protocol/go-ten/go/enclave/crypto" - "github.com/ten-protocol/go-ten/go/ethadapter/mgmtcontractlib" - "github.com/ten-protocol/go-ten/go/obsclient" - "github.com/ten-protocol/go-ten/go/rpc" -) - -const ( - pathAPI = "/api" - pathNumRollups = "/numrollups/" - pathNumTxs = "/numtxs/" - pathGetRollupTime = "/rolluptime/" - pathLatestRollups = "/latestrollups/" - pathLatestTxs = "/latesttxs/" - pathBlock = "/block/" - pathRollup = "/rollup/" - pathDecryptTxBlob = "/decrypttxblob/" - pathAttestation = "/attestation/" - pathAttestationReport = "/attestationreport/" - pathRoot = "/" - - staticDir = "static" - extDivider = "." - extHTML = ".html" - httpCodeErr = 500 -) - -//go:embed static -var staticFiles embed.FS - -// Obscuroscan is a server that allows the monitoring of a running Obscuro network. -type Obscuroscan struct { - server *http.Server - client rpc.Client - obsClient *obsclient.ObsClient - contractABI abi.ABI - logger gethlog.Logger -} - -// Identical to attestation.Report, but with the status mapped to a user-friendly string. -type attestationReportExternal struct { - Data []byte - SecurityVersion uint - Debug bool - UniqueID []byte - SignerID []byte - ProductID []byte - TCBStatus string -} - -func NewObscuroscan(address string, logger gethlog.Logger) *Obscuroscan { - client, err := rpc.NewNetworkClient(address) - if err != nil { - panic(err) - } - obsClient := obsclient.NewObsClient(client) - - contractABI, err := abi.JSON(strings.NewReader(mgmtcontractlib.MgmtContractABI)) - if err != nil { - panic("could not parse management contract ABI to decrypt rollups") - } - - return &Obscuroscan{ - client: client, - obsClient: obsClient, - contractABI: contractABI, - logger: logger, - } -} - -// Serve listens for and serves Obscuroscan requests. -func (o *Obscuroscan) Serve(hostAndPort string) { - serveMux := http.NewServeMux() - - serveMux.HandleFunc(pathAPI+pathNumRollups, o.getNumRollups) // Get the number of published rollups. - serveMux.HandleFunc(pathAPI+pathNumTxs, o.getNumTransactions) // Get the number of rolled-up transactions. - serveMux.HandleFunc(pathAPI+pathGetRollupTime, o.getRollupTime) // Get the average rollup time. - serveMux.HandleFunc(pathAPI+pathLatestRollups, o.getLatestRollups) // Get the latest rollup numbers. - serveMux.HandleFunc(pathAPI+pathLatestTxs, o.getLatestTxs) // Get the latest transaction hashes. - serveMux.HandleFunc(pathAPI+pathRollup, o.getRollupByNumOrTxHash) // Get the rollup given its number or the hash of a transaction it contains. - serveMux.HandleFunc(pathAPI+pathBlock, o.getBlock) // Get the L1 block with the given number. - serveMux.HandleFunc(pathAPI+pathDecryptTxBlob, o.decryptTxBlob) // Decrypt a transaction blob. - serveMux.HandleFunc(pathAPI+pathAttestation, o.attestation) // Retrieve the node's attestation. - serveMux.HandleFunc(pathAPI+pathAttestationReport, o.attestationReport) // Retrieve the node's attestation report. - - // Serves the web assets for the user interface. - staticFileFS, err := fs.Sub(staticFiles, staticDir) - if err != nil { - o.logger.Crit("could not serve static files.", log.ErrKey, err) - } - staticFileFilesystem := http.FileServer(http.FS(staticFileFS)) - serveMux.Handle(pathRoot, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // If we get a request without an extension (other than for the root), we tack on ".html". - if r.URL.Path != pathRoot && !strings.Contains(r.URL.Path, extDivider) { - r.URL.Path += extHTML - } - staticFileFilesystem.ServeHTTP(w, r) - })) - - o.server = &http.Server{Addr: hostAndPort, Handler: serveMux, ReadHeaderTimeout: 10 * time.Second} - err = o.server.ListenAndServe() - if !errors.Is(err, http.ErrServerClosed) { - panic(err) - } -} - -func (o *Obscuroscan) Shutdown() { - if o.server != nil { - err := o.server.Shutdown(context.Background()) - if err != nil { - o.logger.Error("could not shut down Obscuroscan.", log.ErrKey, err) - } - } -} - -// Retrieves the number of published rollups. -func (o *Obscuroscan) getNumRollups(resp http.ResponseWriter, _ *http.Request) { - numOfRollups, err := o.obsClient.BatchNumber() - if err != nil { - o.logger.Error("Could not fetch number of rollups.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch number of rollups.") - return - } - - numOfRollupsStr := strconv.Itoa(int(numOfRollups)) - _, err = resp.Write([]byte(numOfRollupsStr)) - if err != nil { - o.logger.Error("could not return number of rollups to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch number of rollups.") - return - } -} - -// Retrieves the total number of transactions. -func (o *Obscuroscan) getNumTransactions(resp http.ResponseWriter, _ *http.Request) { - var numTransactions *big.Int - err := o.client.Call(&numTransactions, rpc.GetTotalTxs) - if err != nil { - o.logger.Error("Could not fetch total transactions.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch total transactions.") - return - } - - _, err = resp.Write([]byte(numTransactions.String())) - if err != nil { - o.logger.Error("could not return total number of transactions to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch total transactions.") - return - } -} - -// Retrieves the average rollup time, as (time last rollup - time first rollup)/number of rollups -func (o *Obscuroscan) getRollupTime(resp http.ResponseWriter, _ *http.Request) { - numLatestRollup, err := o.obsClient.BatchNumber() - if err != nil { - o.logger.Error("Could not fetch latest rollup number.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch average rollup time.") - return - } - - firstRollupHeader, err := o.obsClient.BatchHeaderByNumber(big.NewInt(0)) - if err != nil || firstRollupHeader == nil { - o.logger.Error("Could not fetch first rollup.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch average rollup time.") - return - } - - latestRollupHeader, err := o.obsClient.BatchHeaderByNumber(big.NewInt(int64(numLatestRollup))) - if err != nil || latestRollupHeader == nil { - o.logger.Error("Could not fetch latest rollup.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch average rollup time.") - return - } - - avgRollupTime := float64(latestRollupHeader.Time-firstRollupHeader.Time) / float64(numLatestRollup) - _, err = resp.Write([]byte(fmt.Sprintf("%.2f", avgRollupTime))) - if err != nil { - o.logger.Error("could not return average rollup time to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch average rollup time.") - return - } -} - -// Retrieves the last five rollup numbers. -func (o *Obscuroscan) getLatestRollups(resp http.ResponseWriter, _ *http.Request) { - latestRollupNum, err := o.obsClient.BatchNumber() - if err != nil { - o.logger.Error("Could not fetch latest rollups.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch latest rollups.") - return - } - - // We walk the chain of rollups, getting the number for the most recent five. - rollupNums := make([]string, 5) - for idx := 0; idx < 5; idx++ { - rollupNum := int(latestRollupNum) - idx - if rollupNum < 0 { - // If there are less than five rollups, we return an N/A. - rollupNums[idx] = "N/A" - } else { - rollupNums[idx] = strconv.Itoa(rollupNum) - } - } - - jsonRollupNums, err := json.Marshal(rollupNums) - if err != nil { - o.logger.Error("could not return latest rollups to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch latest rollups.") - return - } - _, err = resp.Write(jsonRollupNums) - if err != nil { - o.logger.Error("could not return latest rollups to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch latest rollups.") - return - } -} - -// Retrieves the last five transaction hashes. -func (o *Obscuroscan) getLatestTxs(resp http.ResponseWriter, _ *http.Request) { - numTransactions := 5 - - var txHashes []gethcommon.Hash - err := o.client.Call(&txHashes, rpc.GetLatestTxs, numTransactions) - if err != nil { - o.logger.Error("Could not fetch latest transactions.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch latest transactions.") - } - - // We convert the hashes to strings and pad with N/As as needed. - txHashStrings := make([]string, numTransactions) - for idx := 0; idx < numTransactions; idx++ { - if idx < len(txHashes) { - txHashStrings[idx] = txHashes[idx].String() - } else { - txHashStrings[idx] = "N/A" - } - } - - jsonTxHashes, err := json.Marshal(txHashStrings) - if err != nil { - o.logger.Error("could not return latest transaction hashes to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch latest transactions.") - return - } - _, err = resp.Write(jsonTxHashes) - if err != nil { - o.logger.Error("could not return latest transaction hashes to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch latest transactions.") - return - } -} - -// Retrieves the L1 block header with the given number. -func (o *Obscuroscan) getBlock(resp http.ResponseWriter, req *http.Request) { - body := req.Body - defer body.Close() - buffer := new(bytes.Buffer) - _, err := buffer.ReadFrom(body) - if err != nil { - o.logger.Error("could not read request body.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch block.") - return - } - blockHashStr := buffer.String() - blockHash := gethcommon.HexToHash(blockHashStr) - - var blockHeader *types.Header - err = o.client.Call(&blockHeader, rpc.GetBlockHeaderByHash, blockHash) - if err != nil { - o.logger.Info("could not retrieve batch", log.BatchHashKey, blockHash, log.ErrKey, err) - logAndSendErr(resp, "Could not fetch block.") - return - } - - jsonBlock, err := json.Marshal(blockHeader) - if err != nil { - o.logger.Error("could not return block to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch block.") - return - } - _, err = resp.Write(jsonBlock) - if err != nil { - o.logger.Error("could not return block to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch block.") - return - } -} - -// Retrieves a rollup given its number or the hash of a transaction it contains. -func (o *Obscuroscan) getRollupByNumOrTxHash(resp http.ResponseWriter, req *http.Request) { - // Set a response header which allows the client to use a response served from a different domain, i.e. obscuroscan.io. - if httputil.EnableCORS(resp, req) { - return - } - body := req.Body - defer body.Close() - buffer := new(bytes.Buffer) - _, err := buffer.ReadFrom(body) - if err != nil { - o.logger.Error("could not read request body.", log.ErrKey, err) - logAndSendErr(resp, "Could not fetch rollup.") - return - } - - var rollup *common.ExtRollup - if strings.HasPrefix(buffer.String(), "0x") { - // A "0x" prefix indicates that we should retrieve the rollup by transaction hash. - txHash := gethcommon.HexToHash(buffer.String()) - - err = o.client.Call(&rollup, rpc.GetBatchForTx, txHash) - if err != nil || rollup.Header == nil { - o.logger.Error("could not retrieve rollup.", log.ErrKey, err) - logAndSendErr(resp, fmt.Sprintf("Could not fetch rollup for transaction %s.", txHash)) - return - } - } else { - // Otherwise, we treat the input as a rollup number. - rollupNumber, err := strconv.Atoi(buffer.String()) - if err != nil { - o.logger.Error(fmt.Sprintf("could not parse \"%s\" as an integer", buffer.String())) - logAndSendErr(resp, fmt.Sprintf("Could not parse number %s.", buffer.String())) - return - } - rollup, err = o.getRollupByNumber(int64(rollupNumber)) - if err != nil { - o.logger.Error("Could not fetch rollup.", log.ErrKey, err) - logAndSendErr(resp, fmt.Sprintf("Could not fetch rollup for number %d.", rollupNumber)) - return - } - } - - jsonRollup, err := json.Marshal(rollup) - if err != nil { - o.logger.Error("could not return rollup to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not marshal rollup to JSON.") - return - } - _, err = resp.Write(jsonRollup) - if err != nil { - o.logger.Error("could not return rollup to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not return rollup to client.") - return - } -} - -// Decrypts the provided transaction blob using the provided key. -// todo (#1665) - use the passed-in key, rather than a hardcoded enclave key. -func (o *Obscuroscan) decryptTxBlob(resp http.ResponseWriter, req *http.Request) { - body := req.Body - defer body.Close() - buffer := new(bytes.Buffer) - _, err := buffer.ReadFrom(body) - if err != nil { - o.logger.Error("could not read request body.", log.ErrKey, err) - logAndSendErr(resp, "Could not decrypt transaction blob.") - return - } - - jsonTxs, err := decryptTxBlob(buffer.Bytes()) - if err != nil { - o.logger.Error("could not decrypt transaction blob.", log.ErrKey, err) - logAndSendErr(resp, "Could not decrypt transaction blob.") - return - } - - _, err = resp.Write(jsonTxs) - if err != nil { - o.logger.Error("could not write decrypted transactions to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not decrypt transaction blob.") - return - } -} - -// Retrieves the node's attestation. -func (o *Obscuroscan) attestation(resp http.ResponseWriter, _ *http.Request) { - var attestation *common.AttestationReport - err := o.client.Call(&attestation, rpc.Attestation) - if err != nil { - o.logger.Error("could not retrieve node's attestation.", log.ErrKey, err) - logAndSendErr(resp, "Could not retrieve node's attestation.") - return - } - - jsonAttestation, err := json.Marshal(attestation) - if err != nil { - o.logger.Error("could not convert node's attestation to JSON.", log.ErrKey, err) - logAndSendErr(resp, "Could not retrieve node's attestation.") - return - } - _, err = resp.Write(jsonAttestation) - if err != nil { - o.logger.Error("could not return JSON attestation to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not retrieve node's attestation.") - return - } -} - -// Retrieves the node's attestation report. -func (o *Obscuroscan) attestationReport(resp http.ResponseWriter, _ *http.Request) { - var attestation *common.AttestationReport - err := o.client.Call(&attestation, rpc.Attestation) - if err != nil { - o.logger.Error("could not retrieve node's attestation.", log.ErrKey, err) - logAndSendErr(resp, "Could not verify node's attestation.") - return - } - - // If DCAP isn't set up, verifying the report will send a SIGSYS signal. We catch this, so that it doesn't crash the program. - sigChannel := make(chan os.Signal, 1) - defer signal.Stop(sigChannel) - signal.Notify(sigChannel, syscall.SIGSYS) - attestationReport, err := enclave.VerifyRemoteReport(attestation.Report) - signal.Stop(sigChannel) - - if err != nil { - o.logger.Error("could not verify node's attestation.", log.ErrKey, err) - logAndSendErr(resp, "Could not verify node's attestation.") - return - } - - attestationReportExt := attestationReportExternal{ - Data: attestationReport.Data, - SecurityVersion: attestationReport.SecurityVersion, - Debug: attestationReport.Debug, - UniqueID: attestationReport.UniqueID, - SignerID: attestationReport.SignerID, - ProductID: attestationReport.ProductID, - TCBStatus: attestationReport.TCBStatus.String(), - } - - jsonAttestationReport, err := json.Marshal(attestationReportExt) - if err != nil { - o.logger.Error("could not convert node's attestation report to JSON.", log.ErrKey, err) - logAndSendErr(resp, "Could not verify node's attestation.") - return - } - _, err = resp.Write(jsonAttestationReport) - if err != nil { - o.logger.Error("could not return JSON attestation report to client.", log.ErrKey, err) - logAndSendErr(resp, "Could not verify node's attestation.") - return - } -} - -// Returns the rollup with the given number. -func (o *Obscuroscan) getRollupByNumber(rollupNumber int64) (*common.ExtRollup, error) { - // todo (#1665) - if required, consolidate the two calls below into a single RPCGetRollupByNumber call to minimise round trips. - rollupHeader, err := o.obsClient.BatchHeaderByNumber(big.NewInt(rollupNumber)) - if err != nil { - return nil, fmt.Errorf("could not retrieve rollup with number %d. Cause: %w", rollupNumber, err) - } - - var rollup *common.ExtRollup - err = o.client.Call(&rollup, rpc.GetBatch, rollupHeader.Hash()) - if err != nil { - return nil, fmt.Errorf("could not retrieve rollup. Cause: %w", err) - } - - if rollup.Header == nil { - return nil, fmt.Errorf("retrieved rollup had a nil header") - } - - return rollup, nil -} - -// Decrypts the transaction blob and returns it as JSON. -func decryptTxBlob(encryptedTxBytesBase64 []byte) ([]byte, error) { - encryptedTxBytes, err := base64.StdEncoding.DecodeString(string(encryptedTxBytesBase64)) - if err != nil { - return nil, fmt.Errorf("could not decode encrypted transaction blob from Base64. Cause: %w", err) - } - - key := gethcommon.Hex2Bytes(crypto.RollupEncryptionKeyHex) - block, err := aes.NewCipher(key) - if err != nil { - return nil, fmt.Errorf("could not initialise AES cipher for enclave rollup key. Cause: %w", err) - } - transactionCipher, err := cipher.NewGCM(block) - if err != nil { - return nil, fmt.Errorf("could not initialise wrapper for AES cipher for enclave rollup key. Cause: %w", err) - } - - // The nonce is prepended to the ciphertext. - nonce := encryptedTxBytes[0:crypto.NonceLength] - ciphertext := encryptedTxBytes[crypto.NonceLength:] - compressedTxs, err := transactionCipher.Open(nil, nonce, ciphertext, nil) - if err != nil { - return nil, fmt.Errorf("could not decrypt encrypted L2 transactions. Cause: %w", err) - } - - compressionService := compression.NewBrotliDataCompressionService() - - encodedTxs, err := compressionService.Decompress(compressedTxs) - if err != nil { - return nil, fmt.Errorf("could not decompress L2 transactions. Cause: %w", err) - } - - var cleartextTxs []*common.L2Tx - if err = rlp.DecodeBytes(encodedTxs, &cleartextTxs); err != nil { - return nil, fmt.Errorf("could not decode encoded L2 transactions. Cause: %w", err) - } - - jsonRollup, err := json.Marshal(cleartextTxs) - if err != nil { - return nil, fmt.Errorf("could not decrypt transaction blob. Cause: %w", err) - } - - return jsonRollup, nil -} - -// Logs the error message and sends it as an HTTP error. -func logAndSendErr(resp http.ResponseWriter, msg string) { - fmt.Println(msg) - http.Error(resp, msg, httpCodeErr) -} diff --git a/tools/obscuroscan/obscuroscan_test.go b/tools/obscuroscan/obscuroscan_test.go deleted file mode 100644 index 2ac4ea843d..0000000000 --- a/tools/obscuroscan/obscuroscan_test.go +++ /dev/null @@ -1,73 +0,0 @@ -package obscuroscan - -import ( - "context" - "encoding/base64" - "encoding/json" - "net/http" - "net/http/httptest" - "testing" - - "github.com/ten-protocol/go-ten/go/common/compression" - - gethlog "github.com/ethereum/go-ethereum/log" - "github.com/ten-protocol/go-ten/go/common" - "github.com/ten-protocol/go-ten/go/common/httputil" - "github.com/ten-protocol/go-ten/go/enclave/core" - "github.com/ten-protocol/go-ten/go/enclave/crypto" - "github.com/ten-protocol/go-ten/integration/datagenerator" -) - -func TestCanDecryptTxBlob(t *testing.T) { - txs := []*common.L2Tx{datagenerator.CreateL2Tx(), datagenerator.CreateL2Tx()} - - txsJSONBytes, err := decryptTxBlob(generateEncryptedTxBlob(txs)) - if err != nil { - t.Fatalf("transaction blob decryption failed. Cause: %s", err) - } - - expectedTxsJSONBytes, err := json.Marshal(txs) - if err != nil { - t.Fatalf("marshalling transactions to JSON failed. Cause: %s", err) - } - - if string(expectedTxsJSONBytes) != string(txsJSONBytes) { - t.Fatalf("expected %s, got %s", string(expectedTxsJSONBytes), string(txsJSONBytes)) - } -} - -func TestThrowsIfEncryptedRollupIsInvalid(t *testing.T) { - _, err := decryptTxBlob([]byte("invalid_tx_blob")) - if err == nil { - t.Fatal("did not error on invalid transaction blob") - } -} - -// Generates an encrypted transaction blob in Base64 encoding. -func generateEncryptedTxBlob(txs []*common.L2Tx) []byte { - rollup := core.Batch{Header: &common.BatchHeader{}, Transactions: txs} - extB, err := rollup.ToExtBatch(crypto.NewDataEncryptionService(nil), compression.NewBrotliDataCompressionService()) - if err != nil { - panic(err) - } - txBlob := extB.EncryptedTxBlob - return []byte(base64.StdEncoding.EncodeToString(txBlob)) -} - -func TestObscuroscan_getRollupByNumOrTxHash(t *testing.T) { - logger := gethlog.Logger.New(gethlog.Root()) - ob := NewObscuroscan("http://testnet.obscuroscan.io", logger) - req, _ := http.NewRequestWithContext(context.Background(), http.MethodGet, "/", nil) - req.Method = http.MethodOptions - resp := httptest.NewRecorder() - ob.getRollupByNumOrTxHash(resp, req) - if resp.Header().Get(httputil.CorsAllowOrigin) != httputil.OriginAll { - t.Fatal("CORS Allow Origin not set.") - } - if resp.Header().Get(httputil.CorsAllowMethods) != httputil.ReqOptions { - t.Fatal("CORS Allow Methods not set.") - } - if resp.Header().Get(httputil.CorsAllowHeaders) != httputil.CorsHeaders { - t.Fatal("CORS Allow Headers not set.") - } -} diff --git a/tools/obscuroscan/static/attestation.html b/tools/obscuroscan/static/attestation.html deleted file mode 100644 index 84eb156b10..0000000000 --- a/tools/obscuroscan/static/attestation.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - Attestation - - - - - - - - - -
-
-
-

Node attestation and report

- -
- This attestation, and the associated attestation report, allow you to verify that the node is running - the expected Obscuro code on secure hardware. -
-
- -
Attestation
-
N/A
-
- -
Attestation report
-
N/A
-
-
-
- - - - \ No newline at end of file diff --git a/tools/obscuroscan/static/attestation.js b/tools/obscuroscan/static/attestation.js deleted file mode 100644 index 894471f79e..0000000000 --- a/tools/obscuroscan/static/attestation.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; - -const eventDomLoaded = "DOMContentLoaded"; - -const idAttestation = "attestation"; -const idAttestationReport = "attestationReport"; - -const pathAttestation = "/api/attestation/"; -const pathAttestationReport = "/api/attestationreport/" - -// Updates the displayed stats. -async function displayAttestation() { - const fieldAttestation = document.getElementById(idAttestation); - const fieldAttestationReport = document.getElementById(idAttestationReport); - - const respAttestation = await fetch(pathAttestation); - if (respAttestation.ok) { - const attestationJSON = JSON.parse(await respAttestation.text()); - fieldAttestation.innerText = JSON.stringify(attestationJSON, null, "\t"); - } else { - fieldAttestation.innerText = "Failed to fetch attestation."; - } - - const respAttestationReport = await fetch(pathAttestationReport); - if (respAttestationReport.ok) { - const attestationReportJSON = JSON.parse(await respAttestationReport.text()); - fieldAttestationReport.innerText = JSON.stringify(attestationReportJSON, null, "\t"); - } else { - fieldAttestationReport.innerText = "Failed to fetch attestation report. Producing an attestation report is " + - "currently only supported on SGX-enabled Azure virtual machines."; - } -} - -const initialize = async () => { - await displayAttestation(); -} - -window.addEventListener(eventDomLoaded, initialize); \ No newline at end of file diff --git a/tools/obscuroscan/static/favicon-32x32.png b/tools/obscuroscan/static/favicon-32x32.png deleted file mode 100644 index ec512be020..0000000000 Binary files a/tools/obscuroscan/static/favicon-32x32.png and /dev/null differ diff --git a/tools/obscuroscan/static/image-dark.png b/tools/obscuroscan/static/image-dark.png deleted file mode 100644 index 37deb98b42..0000000000 Binary files a/tools/obscuroscan/static/image-dark.png and /dev/null differ diff --git a/tools/obscuroscan/static/index.html b/tools/obscuroscan/static/index.html deleted file mode 100644 index f691b407d9..0000000000 --- a/tools/obscuroscan/static/index.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - Obscuroscan - - - - - - - - -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-

Obscuro block explorer

-
Total rollups: Fetching...
-
Total transactions: Fetching...
-
Avg. rollup time: Fetching...
-
-
-
-
- - -
-
-
-
-
-

Latest rollups

- - -
-
-
-
-
-
-

Latest transactions

- - -
-
-
-
-
- -
-
-
-

Obscuro rollup

-
N/A
-
- -
L1 block
-
N/A
-
- -
Decrypted transaction blob
-
N/A
- -

-

-
-
-
- - - - \ No newline at end of file diff --git a/tools/obscuroscan/static/index.js b/tools/obscuroscan/static/index.js deleted file mode 100644 index a6b9a2b821..0000000000 --- a/tools/obscuroscan/static/index.js +++ /dev/null @@ -1,208 +0,0 @@ -"use strict"; - -const eventDomLoaded = "DOMContentLoaded"; -const typeSubmit = "submit"; -const typeClick = "click"; -const methodPost = "POST"; -const jsonKeyHeader = "Header"; -const jsonKeyL1Proof = "L1Proof"; -const jsonKeyEncryptedTxBlob = "EncryptedTxBlob"; - -const idNumRollups = "numRollups"; -const idNumTxs = "numTxs"; -const idRollupTime = "rollupTime"; -const idFormGetRollup = "form-get-rollup"; -const idRollupID = "rollupID"; -const idResult = "result"; -const idBlock = "block"; -const idRollup = "rollup"; -const idDecryptedTxs = "decryptedTxs"; -const idRollupOne = "rollupOne"; -const idRollupTwo = "rollupTwo"; -const idRollupThree = "rollupThree"; -const idRollupFour = "rollupFour"; -const idRollupFive = "rollupFive"; -const idTxOne = "txOne"; -const idTxTwo = "txTwo"; -const idTxThree = "txThree"; -const idTxFour = "txFour"; -const idTxFive = "txFive"; - -const pathNumRollups = "/api/numrollups/"; -const pathNumTxs = "/api/numtxs/"; -const pathRollupTime = "/api/rolluptime/"; -const pathLatestRollups = "/api/latestrollups/"; -const pathLatestTxs = "/api/latesttxs/"; -const pathBlock = "/api/block/"; -const pathRollup = "/api/rollup/"; -const pathDecryptTxBlob = "/api/decrypttxblob/"; - -// Updates the displayed stats. -async function updateStats() { - const numRollupsField = document.getElementById(idNumRollups); - const numTransactionsField = document.getElementById(idNumTxs); - const rollupTimeField = document.getElementById(idRollupTime); - - const numRollupsResp = await fetch(pathNumRollups); - if (numRollupsResp.ok) { - numRollupsField.innerText = "Total rollups: " + await numRollupsResp.text(); - } else { - numRollupsField.innerText = "Failed to fetch number of rollups."; - } - - const numTransactionsResp = await fetch(pathNumTxs); - if (numTransactionsResp.ok) { - numTransactionsField.innerText = "Total transactions: " + await numTransactionsResp.text(); - } else { - numTransactionsField.innerText = "Failed to fetch number of transactions."; - } - - const rollupTimeResp = await fetch(pathRollupTime); - if (rollupTimeResp.ok) { - rollupTimeField.innerText = `Avg. rollup time: ${await rollupTimeResp.text()} secs`; - } else { - rollupTimeField.innerText = "Failed to fetch average rollup time."; - } -} - -// Updates the list of latest rollups. -async function updateLatestRollups() { - const rollupOneField = document.getElementById(idRollupOne); - const rollupTwoField = document.getElementById(idRollupTwo); - const rollupThreeField = document.getElementById(idRollupThree); - const rollupFourField = document.getElementById(idRollupFour); - const rollupFiveField = document.getElementById(idRollupFive); - - const latestRollupsResp = await fetch(pathLatestRollups); - - if (latestRollupsResp.ok) { - const latestRollupsJSON = JSON.parse(await latestRollupsResp.text()); - rollupOneField.innerText = latestRollupsJSON[0]; - rollupTwoField.innerText = latestRollupsJSON[1]; - rollupThreeField.innerText = latestRollupsJSON[2]; - rollupFourField.innerText = latestRollupsJSON[3]; - rollupFiveField.innerText = latestRollupsJSON[4]; - } else { - const errMsg = "Failed to fetch latest rollups."; - rollupOneField.innerText = errMsg; - rollupTwoField.innerText = errMsg; - rollupThreeField.innerText = errMsg; - rollupFourField.innerText = errMsg; - rollupFiveField.innerText = errMsg; - } -} - -// Updates the list of latest transactions. -async function updateLatestTxs() { - const txOneField = document.getElementById(idTxOne); - const txTwoField = document.getElementById(idTxTwo); - const txThreeField = document.getElementById(idTxThree); - const txFourField = document.getElementById(idTxFour); - const txFiveField = document.getElementById(idTxFive); - - const latestTxsResp = await fetch(pathLatestTxs); - - if (latestTxsResp.ok) { - const latestTxsJSON = JSON.parse(await latestTxsResp.text()); - txOneField.innerText = latestTxsJSON[0]; - txTwoField.innerText = latestTxsJSON[1]; - txThreeField.innerText = latestTxsJSON[2]; - txFourField.innerText = latestTxsJSON[3]; - txFiveField.innerText = latestTxsJSON[4]; - } else { - const errMsg = "Failed to fetch latest transactions."; - txOneField.innerText = errMsg; - txTwoField.innerText = errMsg; - txThreeField.innerText = errMsg; - txFourField.innerText = errMsg; - txFiveField.innerText = errMsg; - } -} - -// Displays the rollup based on the rollup number or transaction hash that has been clicked on. -async function displayClickedItem(event) { - event.preventDefault(); - const rollupNumber = document.getElementById(event.target.id).innerText; - await displayRollup(rollupNumber); -} - -// Displays the rollup with the given identifier (either a rollup number or a transaction hash that it contains). -async function displayRollup(rollupID) { - const resultPane = document.getElementById(idResult); - const blockArea = document.getElementById(idBlock); - const rollupArea = document.getElementById(idRollup); - const decryptedTxsArea = document.getElementById(idDecryptedTxs); - - const rollupResp = await fetch(pathRollup, { - body: rollupID, - method: methodPost - }); - - if (!rollupResp.ok) { - rollupArea.innerText = "Failed to fetch rollup."; - blockArea.innerText = "Failed to fetch block."; - decryptedTxsArea.innerText = "Failed to decrypt transaction blob."; - resultPane.scrollIntoView(); - return; - } - - const rollupJSON = JSON.parse(await rollupResp.text()); - rollupArea.innerText = JSON.stringify(rollupJSON, null, "\t"); - - const blockResp = await fetch(pathBlock, { - body: rollupJSON[jsonKeyHeader][jsonKeyL1Proof], - method: methodPost - }); - - if (blockResp.ok) { - const blockJSON = JSON.parse(await blockResp.text()); - blockArea.innerText = JSON.stringify(blockJSON, null, "\t"); - } else { - blockArea.innerText = "Failed to fetch block."; - } - - const encryptedTxBlob = rollupJSON[jsonKeyEncryptedTxBlob] - const decryptTxBlobResp = await fetch(pathDecryptTxBlob, { - body: encryptedTxBlob, - method: methodPost - }); - - if (decryptTxBlobResp.ok) { - const txBlobJSON = JSON.parse(await decryptTxBlobResp.text()); - decryptedTxsArea.innerText = JSON.stringify(txBlobJSON, null, "\t"); - } else { - decryptedTxsArea.innerText = "Failed to decrypt transaction blob."; - } - - resultPane.scrollIntoView(); -} - -const initialize = () => { - // Updates the page's stats and latest rollups and transactions. - setInterval(async () => { - await updateStats(); - await updateLatestRollups(); - await updateLatestTxs(); - }, 1000); - - // Handles searches for rollups. - document.getElementById(idFormGetRollup).addEventListener(typeSubmit, async (event) => { - event.preventDefault(); - const rollupNumber = document.getElementById(idRollupID).value; - await displayRollup(rollupNumber); - }); - - // Handles clicks on the latest rollups or transactions. - document.getElementById(idRollupOne).addEventListener(typeClick, displayClickedItem); - document.getElementById(idRollupTwo).addEventListener(typeClick, displayClickedItem); - document.getElementById(idRollupThree).addEventListener(typeClick, displayClickedItem); - document.getElementById(idRollupFour).addEventListener(typeClick, displayClickedItem); - document.getElementById(idRollupFive).addEventListener(typeClick, displayClickedItem); - document.getElementById(idTxOne).addEventListener(typeClick, displayClickedItem); - document.getElementById(idTxTwo).addEventListener(typeClick, displayClickedItem); - document.getElementById(idTxThree).addEventListener(typeClick, displayClickedItem); - document.getElementById(idTxFour).addEventListener(typeClick, displayClickedItem); - document.getElementById(idTxFive).addEventListener(typeClick, displayClickedItem); -} - -window.addEventListener(eventDomLoaded, initialize); \ No newline at end of file diff --git a/tools/obscuroscan/static/logo.png b/tools/obscuroscan/static/logo.png deleted file mode 100644 index bf8a0c6bab..0000000000 Binary files a/tools/obscuroscan/static/logo.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/.eslintrc.cjs b/tools/obscuroscan_v2/frontend/.eslintrc.cjs deleted file mode 100644 index b64731a0fe..0000000000 --- a/tools/obscuroscan_v2/frontend/.eslintrc.cjs +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution') - -module.exports = { - root: true, - 'extends': [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - '@vue/eslint-config-prettier/skip-formatting' - ], - parserOptions: { - ecmaVersion: 'latest' - } -} diff --git a/tools/obscuroscan_v2/frontend/.gitignore b/tools/obscuroscan_v2/frontend/.gitignore deleted file mode 100644 index 38adffa64e..0000000000 --- a/tools/obscuroscan_v2/frontend/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -.DS_Store -dist -dist-ssr -coverage -*.local - -/cypress/videos/ -/cypress/screenshots/ - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/tools/obscuroscan_v2/frontend/.prettierrc.json b/tools/obscuroscan_v2/frontend/.prettierrc.json deleted file mode 100644 index 66e23359c3..0000000000 --- a/tools/obscuroscan_v2/frontend/.prettierrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/prettierrc", - "semi": false, - "tabWidth": 2, - "singleQuote": true, - "printWidth": 100, - "trailingComma": "none" -} \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/Dockerfile b/tools/obscuroscan_v2/frontend/Dockerfile deleted file mode 100644 index e37630ff7c..0000000000 --- a/tools/obscuroscan_v2/frontend/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM node:18-buster as runner -# setup container data structure -RUN mkdir -p /home/obscuro/go-obscuro/tools/obscuroscan_v2/ -COPY ./tools/obscuroscan_v2/frontend /home/obscuro/go-obscuro/tools/obscuroscan_v2/frontend - -WORKDIR /home/obscuro/go-obscuro/tools/obscuroscan_v2/frontend -RUN npm install && npm install http-server -g - -EXPOSE 80 \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/README.md b/tools/obscuroscan_v2/frontend/README.md deleted file mode 100644 index 31d6e8e9c2..0000000000 --- a/tools/obscuroscan_v2/frontend/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# frontend - -This template should help get you started developing with Vue 3 in Vite. - -## Customize configuration - -See [Vite Configuration Reference](https://vitejs.dev/config/). - -## Project Setup - -```sh -npm install -``` - -### Compile and Hot-Reload for Development - -```sh -npm run dev -``` - -### Compile and Minify for Production - -```sh -npm run build -``` - -### Lint with [ESLint](https://eslint.org/) - -```sh -npm run lint -``` diff --git a/tools/obscuroscan_v2/frontend/index.html b/tools/obscuroscan_v2/frontend/index.html deleted file mode 100644 index 789e32deb8..0000000000 --- a/tools/obscuroscan_v2/frontend/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - ObscuroScan - - - - - - - -
- - - diff --git a/tools/obscuroscan_v2/frontend/package-lock.json b/tools/obscuroscan_v2/frontend/package-lock.json deleted file mode 100644 index b5178d45c3..0000000000 --- a/tools/obscuroscan_v2/frontend/package-lock.json +++ /dev/null @@ -1,4144 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "frontend", - "version": "0.0.0", - "dependencies": { - "@metamask/detect-provider": "^2.0.0", - "axios": "^1.4.0", - "element-plus": "^2.3.8", - "ethers": "^6.6.7", - "pinia": "^2.1.4", - "vue": "^3.3.4", - "vue-json-pretty": "^2.2.4", - "vue-router": "^4.2.2" - }, - "devDependencies": { - "@rushstack/eslint-patch": "^1.2.0", - "@vitejs/plugin-vue": "^4.2.3", - "@vue/eslint-config-prettier": "^7.1.0", - "eslint": "^8.39.0", - "eslint-plugin-vue": "^9.11.0", - "prettier": "^2.8.8", - "vite": "^4.3.9" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" - }, - "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", - "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", - "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.14.tgz", - "integrity": "sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz", - "integrity": "sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.14.tgz", - "integrity": "sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.14.tgz", - "integrity": "sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.14.tgz", - "integrity": "sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.14.tgz", - "integrity": "sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.14.tgz", - "integrity": "sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.14.tgz", - "integrity": "sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.14.tgz", - "integrity": "sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.14.tgz", - "integrity": "sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.14.tgz", - "integrity": "sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.14.tgz", - "integrity": "sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.14.tgz", - "integrity": "sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.14.tgz", - "integrity": "sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.14.tgz", - "integrity": "sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.14.tgz", - "integrity": "sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.14.tgz", - "integrity": "sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.14.tgz", - "integrity": "sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.14.tgz", - "integrity": "sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.14.tgz", - "integrity": "sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.14.tgz", - "integrity": "sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.14.tgz", - "integrity": "sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", - "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", - "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", - "dependencies": { - "@floating-ui/core": "^1.3.1" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@metamask/detect-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/detect-provider/-/detect-provider-2.0.0.tgz", - "integrity": "sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", - "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", - "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", - "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", - "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", - "dependencies": { - "@babel/parser": "^7.21.3", - "@vue/shared": "3.3.4", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", - "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", - "dependencies": { - "@vue/compiler-core": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", - "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", - "dependencies": { - "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.4", - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-ssr": "3.3.4", - "@vue/reactivity-transform": "3.3.4", - "@vue/shared": "3.3.4", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.0", - "postcss": "^8.1.10", - "source-map-js": "^1.0.2" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", - "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", - "dependencies": { - "@vue/compiler-dom": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", - "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" - }, - "node_modules/@vue/eslint-config-prettier": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz", - "integrity": "sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==", - "dev": true, - "dependencies": { - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0" - }, - "peerDependencies": { - "eslint": ">= 7.28.0", - "prettier": ">= 2.0.0" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", - "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", - "dependencies": { - "@vue/shared": "3.3.4" - } - }, - "node_modules/@vue/reactivity-transform": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", - "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", - "dependencies": { - "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.4", - "@vue/shared": "3.3.4", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.0" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", - "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", - "dependencies": { - "@vue/reactivity": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", - "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", - "dependencies": { - "@vue/runtime-core": "3.3.4", - "@vue/shared": "3.3.4", - "csstype": "^3.1.1" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", - "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", - "dependencies": { - "@vue/compiler-ssr": "3.3.4", - "@vue/shared": "3.3.4" - }, - "peerDependencies": { - "vue": "3.3.4" - } - }, - "node_modules/@vue/shared": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", - "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" - }, - "node_modules/@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/element-plus": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.3.8.tgz", - "integrity": "sha512-yHQR0/tG2LvPkpGUt7Te/hPmP2XW/BytBNUbx+EFO54VnGCOE3upmQcVffNp1PLgwg9sthYDXontUWpnpmLPJw==", - "dependencies": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.0.6", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.3", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/esbuild": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.14.tgz", - "integrity": "sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.14", - "@esbuild/android-arm64": "0.18.14", - "@esbuild/android-x64": "0.18.14", - "@esbuild/darwin-arm64": "0.18.14", - "@esbuild/darwin-x64": "0.18.14", - "@esbuild/freebsd-arm64": "0.18.14", - "@esbuild/freebsd-x64": "0.18.14", - "@esbuild/linux-arm": "0.18.14", - "@esbuild/linux-arm64": "0.18.14", - "@esbuild/linux-ia32": "0.18.14", - "@esbuild/linux-loong64": "0.18.14", - "@esbuild/linux-mips64el": "0.18.14", - "@esbuild/linux-ppc64": "0.18.14", - "@esbuild/linux-riscv64": "0.18.14", - "@esbuild/linux-s390x": "0.18.14", - "@esbuild/linux-x64": "0.18.14", - "@esbuild/netbsd-x64": "0.18.14", - "@esbuild/openbsd-x64": "0.18.14", - "@esbuild/sunos-x64": "0.18.14", - "@esbuild/win32-arm64": "0.18.14", - "@esbuild/win32-ia32": "0.18.14", - "@esbuild/win32-x64": "0.18.14" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz", - "integrity": "sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.3.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.3.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", - "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ethers": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.7.tgz", - "integrity": "sha512-1SdT3W5/IPAcx9l5/+9qKRYR/iqVIdNQIct18yeh+XvN+I4RK44mvOsAerMwJYCAwdQfsOgf3OkfozeuMInbtQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/pinia": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.4.tgz", - "integrity": "sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==", - "dependencies": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": ">=0.14.5" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "@vue/composition-api": "^1.4.0", - "typescript": ">=4.4.4", - "vue": "^2.6.14 || ^3.3.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/pinia/node_modules/vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.26.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", - "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", - "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", - "dependencies": { - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-sfc": "3.3.4", - "@vue/runtime-dom": "3.3.4", - "@vue/server-renderer": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "node_modules/vue-eslint-parser": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", - "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-json-pretty": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-2.2.4.tgz", - "integrity": "sha512-JX80b3QDrspcH43C53CdtYeq/froApQGSV5y43bEMWFj2LGOxB96aH1VmvrFA21nD1WTP6nwfFMQqGXuS4jyFQ==", - "engines": { - "node": ">= 10.0.0", - "npm": ">= 5.0.0" - }, - "peerDependencies": { - "vue": ">=3.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", - "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", - "dependencies": { - "@vue/devtools-api": "^6.5.0" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" - }, - "@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" - }, - "@ctrl/tinycolor": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", - "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" - }, - "@element-plus/icons-vue": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.1.0.tgz", - "integrity": "sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==", - "requires": {} - }, - "@esbuild/android-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.14.tgz", - "integrity": "sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz", - "integrity": "sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.14.tgz", - "integrity": "sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.14.tgz", - "integrity": "sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.14.tgz", - "integrity": "sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.14.tgz", - "integrity": "sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.14.tgz", - "integrity": "sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.14.tgz", - "integrity": "sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.14.tgz", - "integrity": "sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.14.tgz", - "integrity": "sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.14.tgz", - "integrity": "sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.14.tgz", - "integrity": "sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.14.tgz", - "integrity": "sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.14.tgz", - "integrity": "sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.14.tgz", - "integrity": "sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.14.tgz", - "integrity": "sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.14.tgz", - "integrity": "sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.14.tgz", - "integrity": "sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.14.tgz", - "integrity": "sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.14.tgz", - "integrity": "sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.14.tgz", - "integrity": "sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.14.tgz", - "integrity": "sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", - "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", - "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", - "dev": true - }, - "@floating-ui/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", - "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" - }, - "@floating-ui/dom": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", - "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", - "requires": { - "@floating-ui/core": "^1.3.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "@metamask/detect-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/detect-provider/-/detect-provider-2.0.0.tgz", - "integrity": "sha512-sFpN+TX13E9fdBDh9lvQeZdJn4qYoRb/6QF2oZZK/Pn559IhCFacPMU1rMuqyXoFQF3JSJfii2l98B87QDPeCQ==" - }, - "@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" - }, - "@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@popperjs/core": { - "version": "npm:@sxzz/popperjs-es@2.11.7", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" - }, - "@rushstack/eslint-patch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", - "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.195", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", - "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" - }, - "@types/lodash-es": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.8.tgz", - "integrity": "sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==", - "requires": { - "@types/lodash": "*" - } - }, - "@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" - }, - "@vitejs/plugin-vue": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", - "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", - "dev": true, - "requires": {} - }, - "@vue/compiler-core": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", - "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", - "requires": { - "@babel/parser": "^7.21.3", - "@vue/shared": "3.3.4", - "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" - } - }, - "@vue/compiler-dom": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", - "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", - "requires": { - "@vue/compiler-core": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "@vue/compiler-sfc": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", - "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", - "requires": { - "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.4", - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-ssr": "3.3.4", - "@vue/reactivity-transform": "3.3.4", - "@vue/shared": "3.3.4", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.0", - "postcss": "^8.1.10", - "source-map-js": "^1.0.2" - } - }, - "@vue/compiler-ssr": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", - "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", - "requires": { - "@vue/compiler-dom": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "@vue/devtools-api": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", - "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" - }, - "@vue/eslint-config-prettier": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz", - "integrity": "sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==", - "dev": true, - "requires": { - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0" - } - }, - "@vue/reactivity": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", - "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", - "requires": { - "@vue/shared": "3.3.4" - } - }, - "@vue/reactivity-transform": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", - "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", - "requires": { - "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.4", - "@vue/shared": "3.3.4", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.0" - } - }, - "@vue/runtime-core": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", - "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", - "requires": { - "@vue/reactivity": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "@vue/runtime-dom": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", - "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", - "requires": { - "@vue/runtime-core": "3.3.4", - "@vue/shared": "3.3.4", - "csstype": "^3.1.1" - } - }, - "@vue/server-renderer": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", - "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", - "requires": { - "@vue/compiler-ssr": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "@vue/shared": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", - "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" - }, - "@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "requires": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "requires": {} - } - } - }, - "@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" - }, - "@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "requires": { - "vue-demi": "*" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "requires": {} - } - } - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "dayjs": { - "version": "1.11.9", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", - "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "element-plus": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.3.8.tgz", - "integrity": "sha512-yHQR0/tG2LvPkpGUt7Te/hPmP2XW/BytBNUbx+EFO54VnGCOE3upmQcVffNp1PLgwg9sthYDXontUWpnpmLPJw==", - "requires": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.0.6", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.3", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - } - }, - "esbuild": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.14.tgz", - "integrity": "sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.14", - "@esbuild/android-arm64": "0.18.14", - "@esbuild/android-x64": "0.18.14", - "@esbuild/darwin-arm64": "0.18.14", - "@esbuild/darwin-x64": "0.18.14", - "@esbuild/freebsd-arm64": "0.18.14", - "@esbuild/freebsd-x64": "0.18.14", - "@esbuild/linux-arm": "0.18.14", - "@esbuild/linux-arm64": "0.18.14", - "@esbuild/linux-ia32": "0.18.14", - "@esbuild/linux-loong64": "0.18.14", - "@esbuild/linux-mips64el": "0.18.14", - "@esbuild/linux-ppc64": "0.18.14", - "@esbuild/linux-riscv64": "0.18.14", - "@esbuild/linux-s390x": "0.18.14", - "@esbuild/linux-x64": "0.18.14", - "@esbuild/netbsd-x64": "0.18.14", - "@esbuild/openbsd-x64": "0.18.14", - "@esbuild/sunos-x64": "0.18.14", - "@esbuild/win32-arm64": "0.18.14", - "@esbuild/win32-ia32": "0.18.14", - "@esbuild/win32-x64": "0.18.14" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", - "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.1.0", - "@eslint/js": "8.44.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.6.0", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-vue": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz", - "integrity": "sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.3.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^9.3.0", - "xml-name-validator": "^4.0.0" - } - }, - "eslint-scope": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", - "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "ethers": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.7.tgz", - "integrity": "sha512-1SdT3W5/IPAcx9l5/+9qKRYR/iqVIdNQIct18yeh+XvN+I4RK44mvOsAerMwJYCAwdQfsOgf3OkfozeuMInbtQ==", - "requires": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "requires": {} - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "pinia": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.4.tgz", - "integrity": "sha512-vYlnDu+Y/FXxv1ABo1vhjC+IbqvzUdiUC3sfDRrRyY2CQSrqqaa+iiHmqtARFxJVqWQMCJfXx1PBvFs9aJVLXQ==", - "requires": { - "@vue/devtools-api": "^6.5.0", - "vue-demi": ">=0.14.5" - }, - "dependencies": { - "vue-demi": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", - "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", - "requires": {} - } - } - }, - "postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "3.26.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", - "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "requires": { - "esbuild": "^0.18.10", - "fsevents": "~2.3.2", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - } - }, - "vue": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", - "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", - "requires": { - "@vue/compiler-dom": "3.3.4", - "@vue/compiler-sfc": "3.3.4", - "@vue/runtime-dom": "3.3.4", - "@vue/server-renderer": "3.3.4", - "@vue/shared": "3.3.4" - } - }, - "vue-eslint-parser": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", - "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", - "dev": true, - "requires": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - } - }, - "vue-json-pretty": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/vue-json-pretty/-/vue-json-pretty-2.2.4.tgz", - "integrity": "sha512-JX80b3QDrspcH43C53CdtYeq/froApQGSV5y43bEMWFj2LGOxB96aH1VmvrFA21nD1WTP6nwfFMQqGXuS4jyFQ==", - "requires": {} - }, - "vue-router": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.4.tgz", - "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", - "requires": { - "@vue/devtools-api": "^6.5.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/tools/obscuroscan_v2/frontend/package.json b/tools/obscuroscan_v2/frontend/package.json deleted file mode 100644 index 0e99f9267b..0000000000 --- a/tools/obscuroscan_v2/frontend/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.0", - "private": true, - "scripts": { - "dev": "cp src/lib/config.dev.js src/lib/config.js && vite", - "build": "vite build", - "build-prod": "cp src/lib/config.prod.js src/lib/config.js && npm run build", - "serve-prod": "npm run build-prod && http-server dist/ -a 0.0.0.0 -p 80", - "preview": "vite preview", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore", - "format": "prettier --write src/" - }, - "dependencies": { - "@metamask/detect-provider": "^2.0.0", - "axios": "^1.4.0", - "element-plus": "^2.3.8", - "ethers": "^6.6.7", - "pinia": "^2.1.4", - "vue": "^3.3.4", - "vue-json-pretty": "^2.2.4", - "vue-router": "^4.2.2" - }, - "devDependencies": { - "@rushstack/eslint-patch": "^1.2.0", - "@vitejs/plugin-vue": "^4.2.3", - "@vue/eslint-config-prettier": "^7.1.0", - "eslint": "^8.39.0", - "eslint-plugin-vue": "^9.11.0", - "prettier": "^2.8.8", - "vite": "^4.3.9" - } -} diff --git a/tools/obscuroscan_v2/frontend/public/favicon-32x32.png b/tools/obscuroscan_v2/frontend/public/favicon-32x32.png deleted file mode 100644 index ec512be020..0000000000 Binary files a/tools/obscuroscan_v2/frontend/public/favicon-32x32.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/App.vue b/tools/obscuroscan_v2/frontend/src/App.vue deleted file mode 100644 index 2466145094..0000000000 --- a/tools/obscuroscan_v2/frontend/src/App.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/assets/base.css b/tools/obscuroscan_v2/frontend/src/assets/base.css deleted file mode 100644 index d3de42ec96..0000000000 --- a/tools/obscuroscan_v2/frontend/src/assets/base.css +++ /dev/null @@ -1,73 +0,0 @@ -/* color palette from */ -:root { - --vt-c-white: #ffffff; - --vt-c-white-soft: #f8f8f8; - --vt-c-white-mute: #f2f2f2; - - --vt-c-black: #181818; - --vt-c-black-soft: #222222; - --vt-c-black-mute: #282828; - - --vt-c-indigo: #2c3e50; - - --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); - --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); - --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); - --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); - - --vt-c-text-light-1: var(--vt-c-indigo); - --vt-c-text-light-2: rgba(60, 60, 60, 0.66); - --vt-c-text-dark-1: var(--vt-c-white); - --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); -} - -/* semantic color variables for this project */ -:root { - --color-background: var(--vt-c-white); - --color-background-soft: var(--vt-c-white-soft); - --color-background-mute: var(--vt-c-white-mute); - - --color-border: var(--vt-c-divider-light-2); - --color-border-hover: var(--vt-c-divider-light-1); - - --color-heading: var(--vt-c-text-light-1); - --color-text: var(--vt-c-text-light-1); - - --section-gap: 160px; -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--vt-c-black); - --color-background-soft: var(--vt-c-black-soft); - --color-background-mute: var(--vt-c-black-mute); - - --color-border: var(--vt-c-divider-dark-2); - --color-border-hover: var(--vt-c-divider-dark-1); - - --color-heading: var(--vt-c-text-dark-1); - --color-text: var(--vt-c-text-dark-2); - } -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - font-weight: normal; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - transition: color 0.5s, background-color 0.5s; - line-height: 1.6; - font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, - Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - font-size: 15px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/github-mark-white.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/github-mark-white.png deleted file mode 100644 index 50b8175227..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/github-mark-white.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/github_logo.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/github_logo.png deleted file mode 100644 index 3a4c6bd02b..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/github_logo.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_contracts.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_contracts.png deleted file mode 100644 index d22f56f573..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_contracts.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_ethereum.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_ethereum.png deleted file mode 100644 index c94b2857e9..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_ethereum.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_l1_rollup.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_l1_rollup.png deleted file mode 100644 index 780575ecdb..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_l1_rollup.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_l2_batch.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_l2_batch.png deleted file mode 100644 index 780575ecdb..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_l2_batch.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_metamask.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_metamask.png deleted file mode 100644 index 9696ef127e..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_metamask.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_nodes.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_nodes.png deleted file mode 100644 index c41d108cfc..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_nodes.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_transactions.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_transactions.png deleted file mode 100644 index d22f56f573..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/icon_transactions.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/ten.svg b/tools/obscuroscan_v2/frontend/src/assets/imgs/ten.svg deleted file mode 100644 index 1c51495c5b..0000000000 --- a/tools/obscuroscan_v2/frontend/src/assets/imgs/ten.svg +++ /dev/null @@ -1,6 +0,0 @@ - -TEN. - diff --git a/tools/obscuroscan_v2/frontend/src/assets/imgs/twitter_logo.png b/tools/obscuroscan_v2/frontend/src/assets/imgs/twitter_logo.png deleted file mode 100644 index 26b539417b..0000000000 Binary files a/tools/obscuroscan_v2/frontend/src/assets/imgs/twitter_logo.png and /dev/null differ diff --git a/tools/obscuroscan_v2/frontend/src/assets/main.css b/tools/obscuroscan_v2/frontend/src/assets/main.css deleted file mode 100644 index a2ff76f1c9..0000000000 --- a/tools/obscuroscan_v2/frontend/src/assets/main.css +++ /dev/null @@ -1,7 +0,0 @@ -@import './base.css'; - -#app { - font-weight: normal; -} - - diff --git a/tools/obscuroscan_v2/frontend/src/components/BatchDataGrid.vue b/tools/obscuroscan_v2/frontend/src/components/BatchDataGrid.vue deleted file mode 100644 index 608db99a57..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/BatchDataGrid.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/components/BlocksDataGrid.vue b/tools/obscuroscan_v2/frontend/src/components/BlocksDataGrid.vue deleted file mode 100644 index 591c28675b..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/BlocksDataGrid.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/components/BotBarItem.vue b/tools/obscuroscan_v2/frontend/src/components/BotBarItem.vue deleted file mode 100644 index ef29ff5f85..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/BotBarItem.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/MetaMaskConnectButton.vue b/tools/obscuroscan_v2/frontend/src/components/MetaMaskConnectButton.vue deleted file mode 100644 index 4a1bf18ef9..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/MetaMaskConnectButton.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/PersonalTxsGrid.vue b/tools/obscuroscan_v2/frontend/src/components/PersonalTxsGrid.vue deleted file mode 100644 index d505cd93eb..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/PersonalTxsGrid.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/components/PublicTxDataGrid.vue b/tools/obscuroscan_v2/frontend/src/components/PublicTxDataGrid.vue deleted file mode 100644 index c0b1fa1b40..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/PublicTxDataGrid.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/components/RotatingBatchesItem.vue b/tools/obscuroscan_v2/frontend/src/components/RotatingBatchesItem.vue deleted file mode 100644 index 294cd3355a..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/RotatingBatchesItem.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/RotatingRollupsItem.vue b/tools/obscuroscan_v2/frontend/src/components/RotatingRollupsItem.vue deleted file mode 100644 index 3ade490d46..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/RotatingRollupsItem.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/SearchBarItem.vue b/tools/obscuroscan_v2/frontend/src/components/SearchBarItem.vue deleted file mode 100644 index 16159ba87f..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/SearchBarItem.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/SummaryItem.vue b/tools/obscuroscan_v2/frontend/src/components/SummaryItem.vue deleted file mode 100644 index 3ef5d95734..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/SummaryItem.vue +++ /dev/null @@ -1,140 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/components/SummaryRollupsListItem.vue b/tools/obscuroscan_v2/frontend/src/components/SummaryRollupsListItem.vue deleted file mode 100644 index 9f6f4c007b..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/SummaryRollupsListItem.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/VerifiedContractsDataGrid.vue b/tools/obscuroscan_v2/frontend/src/components/VerifiedContractsDataGrid.vue deleted file mode 100644 index e9f03cbafa..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/VerifiedContractsDataGrid.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/helper/BatchInfoWindow.vue b/tools/obscuroscan_v2/frontend/src/components/helper/BatchInfoWindow.vue deleted file mode 100644 index 2589c984f0..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/helper/BatchInfoWindow.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/components/helper/ShortenedHash.vue b/tools/obscuroscan_v2/frontend/src/components/helper/ShortenedHash.vue deleted file mode 100644 index 87d5092bac..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/helper/ShortenedHash.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/components/helper/Timestamp.vue b/tools/obscuroscan_v2/frontend/src/components/helper/Timestamp.vue deleted file mode 100644 index c40b3fb517..0000000000 --- a/tools/obscuroscan_v2/frontend/src/components/helper/Timestamp.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/lib/cachedList.js b/tools/obscuroscan_v2/frontend/src/lib/cachedList.js deleted file mode 100644 index a6eee42195..0000000000 --- a/tools/obscuroscan_v2/frontend/src/lib/cachedList.js +++ /dev/null @@ -1,27 +0,0 @@ -class CachedList { - constructor() { - // todo these should just be one storage - this.items = []; - this.itemsByHash = {}; - } - - add(item) { - if (!this.items.some(i => i.hash === item.hash)) { - this.items.push(item); - } - } - - get() { - return this.items.slice(-5); - } - - addByHash(item) { - this.itemsByHash[item.Header.hash] = item - } - - getByHash(hash) { - return this.itemsByHash[hash] - } -} - -export default CachedList \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/lib/config.dev.js b/tools/obscuroscan_v2/frontend/src/lib/config.dev.js deleted file mode 100644 index cf242044b4..0000000000 --- a/tools/obscuroscan_v2/frontend/src/lib/config.dev.js +++ /dev/null @@ -1,8 +0,0 @@ -class Config { - static backendServerAddress = "http://127.0.0.1:43910" - static pollingInterval = 1000 - static pricePollingInterval = 60*1000 // 1 minute - static version = "dev" -} - -export default Config \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/lib/config.js b/tools/obscuroscan_v2/frontend/src/lib/config.js deleted file mode 100644 index cf242044b4..0000000000 --- a/tools/obscuroscan_v2/frontend/src/lib/config.js +++ /dev/null @@ -1,8 +0,0 @@ -class Config { - static backendServerAddress = "http://127.0.0.1:43910" - static pollingInterval = 1000 - static pricePollingInterval = 60*1000 // 1 minute - static version = "dev" -} - -export default Config \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/lib/config.prod.js b/tools/obscuroscan_v2/frontend/src/lib/config.prod.js deleted file mode 100644 index affe11ac2b..0000000000 --- a/tools/obscuroscan_v2/frontend/src/lib/config.prod.js +++ /dev/null @@ -1,9 +0,0 @@ -class Config { - // VITE_APIHOSTADDRESS should be used as an env var at the prod server - static backendServerAddress = import.meta.env.VITE_APIHOSTADDRESS - static pollingInterval = 1000 - static pricePollingInterval = 60*1000 // 1 minute - static version = import.meta.env.VITE_FE_VERSION -} - -export default Config \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/lib/poller.js b/tools/obscuroscan_v2/frontend/src/lib/poller.js deleted file mode 100644 index 8a758bd94b..0000000000 --- a/tools/obscuroscan_v2/frontend/src/lib/poller.js +++ /dev/null @@ -1,25 +0,0 @@ -class Poller { - constructor(fetchCallback, interval) { - this.fetchCallback = fetchCallback; - this.interval = interval; - this.timer = null; - } - - // Start polling - executes the fetchCallback immediately and every interval thereafter - start() { - this.stop(); // Ensure previous intervals are cleared - this.fetchCallback(); - this.timer = setInterval(async () => { - await this.fetchCallback(); - }, this.interval); - } - - stop() { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - } -} - -export default Poller \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/main.js b/tools/obscuroscan_v2/frontend/src/main.js deleted file mode 100644 index 26a2f9f48e..0000000000 --- a/tools/obscuroscan_v2/frontend/src/main.js +++ /dev/null @@ -1,27 +0,0 @@ -import './assets/main.css' - -import { createApp } from 'vue' -import {createPinia, setActivePinia} from 'pinia' -import ElementPlus from 'element-plus' -import 'element-plus/dist/index.css' -import * as ElementPlusIconsVue from '@element-plus/icons-vue' -import App from './App.vue' -import router from './router' -import Config from "@/lib/config"; - -const pinia = createPinia() -const app = createApp(App) - -app.use(pinia) -setActivePinia(pinia) - -for (const [key, component] of Object.entries(ElementPlusIconsVue)) { - app.component(key, component) -} - -app.use(ElementPlus) -app.config.globalProperties.RunConfig =new Config() -app.use(router) - - -app.mount('#app') diff --git a/tools/obscuroscan_v2/frontend/src/router/index.js b/tools/obscuroscan_v2/frontend/src/router/index.js deleted file mode 100644 index f9830e81fc..0000000000 --- a/tools/obscuroscan_v2/frontend/src/router/index.js +++ /dev/null @@ -1,45 +0,0 @@ -import { createRouter, createWebHistory } from 'vue-router' -import HomeView from '../views/HomeView.vue' - -const router = createRouter({ - history: createWebHistory(import.meta.env.BASE_URL), - routes: [ - { - path: '/', - name: 'home', - component: HomeView - }, - { - path: '/personal', - name: 'personal', - component: () => import('../views/PersonalView.vue') - }, - { - path: '/transactions', - name: 'transactions', - component: () => import('../views/TransactionsView.vue') - }, - { - path: '/batches', - name: 'batches', - component: () => import('../views/BatchesView.vue') - }, - { - path: '/blocks', - name: 'blocks', - component: () => import('../views/BlocksView.vue') - }, - { - path: '/decrypt', - name: 'decrypt', - component: () => import('../views/DecryptView.vue') - }, - { - path: '/verified', - name: 'verifiedData', - component: () => import('../views/VerifiedData.vue') - } - ] -}) - -export default router diff --git a/tools/obscuroscan_v2/frontend/src/stores/batchStore.js b/tools/obscuroscan_v2/frontend/src/stores/batchStore.js deleted file mode 100644 index bb3535ec46..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/batchStore.js +++ /dev/null @@ -1,66 +0,0 @@ -import { defineStore } from 'pinia'; -import Config from "@/lib/config"; -import CachedList from "@/lib/cachedList"; -import Poller from "@/lib/poller"; - -export const useBatchStore = defineStore({ - id: 'batchStore', - state: () => ({ - latestBatch: null, - latestL1Proof: null, - - batchListing: null, - batchListingCount: null, - offset: 0, - size: 10, - - batches: new CachedList(), - poller: new Poller(() => { - const store = useBatchStore(); - store.fetch(); - }, Config.pollingInterval) - }), - actions: { - async fetch() { - try { - // fetch the latest batch - const response = await fetch( Config.backendServerAddress+'/items/batch/latest/'); - const data = await response.json(); - this.latestBatch = data.item.number; - this.latestL1Proof = data.item.l1Proof; - - this.batches.add(data.item); - - // fetch data listing - const responseList = await fetch( Config.backendServerAddress+`/items/batches/?offset=${this.offset}&size=${this.size}`); - const dataList = await responseList.json(); - this.batchListing = dataList.result.BatchesData; - this.batchListingCount = dataList.result.Total; - - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - }, - - async getByHash(hash) { - let batch = this.batches.getByHash(hash) - if (batch) { - return batch - } - - const response = await fetch( Config.backendServerAddress+`/items/batch/${hash}`); - const data = await response.json(); - this.batches.addByHash(data.item); - - return this.batches.getByHash(hash) - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/blockStore.js b/tools/obscuroscan_v2/frontend/src/stores/blockStore.js deleted file mode 100644 index 78f1fae4ca..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/blockStore.js +++ /dev/null @@ -1,41 +0,0 @@ -import { defineStore } from 'pinia'; -import Config from "@/lib/config"; -import Poller from "@/lib/poller"; - - -export const useBlockStore = defineStore({ - id: 'blockStore', - state: () => ({ - blocksListing: null, - blocksListingCount: null, - offset: 0, - size: 10, - - poller: new Poller(() => { - const store = useBlockStore(); - store.fetch(); - }, Config.pollingInterval) - }), - actions: { - async fetch() { - this.loading = true; - try { - // fetch data listing - const responseList = await fetch( Config.backendServerAddress+`/items/blocks/?offset=${this.offset}&size=${this.size}`); - const dataList = await responseList.json(); - this.blocksListing = dataList.result.BlocksData; - this.blocksListingCount = dataList.result.Total; - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/counterStore.js b/tools/obscuroscan_v2/frontend/src/stores/counterStore.js deleted file mode 100644 index 3df8057abe..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/counterStore.js +++ /dev/null @@ -1,38 +0,0 @@ -import { defineStore } from 'pinia'; -import Config from "@/lib/config"; -import Poller from "@/lib/poller"; - -export const useCounterStore = defineStore({ - id: 'counterStore', - state: () => ({ - totalContractCount: 0, - totalTransactionCount:0, - poller: new Poller(() => { - const store = useCounterStore(); - store.fetch(); - }, Config.pollingInterval) - }), - actions: { - async fetch() { - try { - const totContractResp = await fetch( Config.backendServerAddress+'/count/contracts/'); - const totContractData = await totContractResp.json(); - this.totalContractCount = totContractData.count; - - const totTxResp = await fetch( Config.backendServerAddress+'/count/transactions/'); - const totTxData = await totTxResp.json(); - this.totalTransactionCount = totTxData.count; - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/personalDataStore.js b/tools/obscuroscan_v2/frontend/src/stores/personalDataStore.js deleted file mode 100644 index a380126e64..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/personalDataStore.js +++ /dev/null @@ -1,48 +0,0 @@ -import { defineStore } from 'pinia'; -import Config from "@/lib/config"; -import {useWalletStore} from "@/stores/walletStore"; -import Poller from "@/lib/poller"; - -export const usePersonalDataStore = defineStore({ - id: 'personalDataStore', - state: () => ({ - walletStarted: false, - personalTransactionList: null, - personalTransactionCount: null, - offset: 0, - size: 10, - poller: new Poller(() => { - const store = usePersonalDataStore(); - store.fetch(); - }, Config.pollingInterval) - }), - actions: { - async fetch() { - try { - const walletStore = useWalletStore() - if (walletStore.provider == null) { - return - } - - console.log(this.address) - const requestPayload = { - "address": walletStore.address, - "pagination": {"offset": this.offset, "size": this.size}, - } - const personalTxData = await walletStore.provider.send('eth_getStorageAt', ["listPersonalTransactions", requestPayload, null]) - this.personalTransactionList = personalTxData.result.Receipts; - this.personalTransactionCount = personalTxData.result.Total; - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/priceStore.js b/tools/obscuroscan_v2/frontend/src/stores/priceStore.js deleted file mode 100644 index 60c07a7dc3..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/priceStore.js +++ /dev/null @@ -1,35 +0,0 @@ -import { defineStore } from 'pinia'; -import Config from "@/lib/config"; -import Poller from "@/lib/poller"; - -export const usePriceStore = defineStore({ - id: 'priceStore', - state: () => ({ - ethPriceUSD: null, - poller: new Poller(() => { - const store = usePriceStore(); - store.fetch(); - }, Config.pricePollingInterval) - }), - actions: { - async fetch() { - try { - const response = await fetch( 'https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd'); - const data = await response.json(); - this.ethPriceUSD = data.ethereum.usd; - - console.log("Fetched " + this.ethPriceUSD); - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/publicTxDataStore.js b/tools/obscuroscan_v2/frontend/src/stores/publicTxDataStore.js deleted file mode 100644 index a9ddb0b9fe..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/publicTxDataStore.js +++ /dev/null @@ -1,38 +0,0 @@ -import {defineStore} from 'pinia'; -import Config from "@/lib/config"; -import Poller from "@/lib/poller"; - -export const usePublicDataStore = defineStore({ - id: 'publicDataStore', - state: () => ({ - publicTransactionsData: null, - publicTransactionsCount: null, - offset: 0, - size: 10, - poller: new Poller(() => { - const store = usePublicDataStore(); - store.fetch(); - }, Config.pollingInterval) - }), - actions: { - async fetch() { - try { - const response = await fetch( Config.backendServerAddress+`/items/transactions/?offset=${this.offset}&size=${this.size}`); - - const data = await response.json(); - this.publicTransactionsData = data.result.TransactionsData; - this.publicTransactionsCount = data.result.Total; - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/rollupStore.js b/tools/obscuroscan_v2/frontend/src/stores/rollupStore.js deleted file mode 100644 index 02e9b65928..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/rollupStore.js +++ /dev/null @@ -1,36 +0,0 @@ -import { defineStore } from 'pinia'; -import Config from "@/lib/config"; -import CachedList from "@/lib/cachedList"; -import Poller from "@/lib/poller"; - - -export const useRollupStore = defineStore({ - id: 'rollupStore', - state: () => ({ - rollups: new CachedList(), - poller: new Poller(() => { - const store = useRollupStore(); - store.fetch(); - }, Config.pollingInterval) - }), - actions: { - async fetch() { - this.loading = true; - try { - const response = await fetch( Config.backendServerAddress+'/items/rollup/latest/'); - const data = await response.json(); - this.rollups.add(data.item); - } catch (error) { - console.error("Failed to fetch count:", error); - } - }, - - startPolling() { - this.poller.start(); - }, - - stopPolling() { - this.poller.stop(); - } - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/verifiedContractStore.js b/tools/obscuroscan_v2/frontend/src/stores/verifiedContractStore.js deleted file mode 100644 index 5a32ca02b4..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/verifiedContractStore.js +++ /dev/null @@ -1,46 +0,0 @@ -import {defineStore} from 'pinia'; -import Config from "@/lib/config"; - -export const useVerifiedContractStore = defineStore({ - id: 'VerifiedContractStore', - state: () => ({ - contracts: null, - sequencerData: null - }), - actions: { - async update() { - try { - const response = await fetch( Config.backendServerAddress+`/info/obscuro/`); - - const data = await response.json(); - this.contracts = - [ - { - "name": "Management Contract", - "address": data.item.ManagementContractAddress, - "confirmed": true - }, - { - "name": "Message Bus Contract", - "address": data.item.MessageBusAddress, - "confirmed": true - } - ]; - this.sequencerData = [ - { - "name": "Sequencer ID", - "address": data.item.SequencerID, - "confirmed": true, - }, - { - "name": "L1 Start Hash", - "address": data.item.L1StartHash, - "confirmed": true, - } - ] - } catch (error) { - console.error("Failed to fetch item:", error); - } - }, - }, -}); diff --git a/tools/obscuroscan_v2/frontend/src/stores/walletStore.js b/tools/obscuroscan_v2/frontend/src/stores/walletStore.js deleted file mode 100644 index 0d58cbb976..0000000000 --- a/tools/obscuroscan_v2/frontend/src/stores/walletStore.js +++ /dev/null @@ -1,17 +0,0 @@ -import { defineStore } from 'pinia'; - -export const useWalletStore = defineStore({ - id: 'wallet', - state: () => ({ - provider: null, - address: null - }), - actions: { - setProvider(provider) { - this.provider = provider; - }, - setAddress(address) { - this.address = address; - } - } -}); \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/views/AboutView.vue b/tools/obscuroscan_v2/frontend/src/views/AboutView.vue deleted file mode 100644 index 756ad2a179..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/AboutView.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/BatchesView.vue b/tools/obscuroscan_v2/frontend/src/views/BatchesView.vue deleted file mode 100644 index 8b2d4764d7..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/BatchesView.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/BlocksView.vue b/tools/obscuroscan_v2/frontend/src/views/BlocksView.vue deleted file mode 100644 index 021a183d23..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/BlocksView.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/DecryptView.vue b/tools/obscuroscan_v2/frontend/src/views/DecryptView.vue deleted file mode 100644 index 6b69249b5c..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/DecryptView.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - \ No newline at end of file diff --git a/tools/obscuroscan_v2/frontend/src/views/HomeView.vue b/tools/obscuroscan_v2/frontend/src/views/HomeView.vue deleted file mode 100644 index 29f9dc2903..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/HomeView.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/NavbarView.vue b/tools/obscuroscan_v2/frontend/src/views/NavbarView.vue deleted file mode 100644 index 99ee079803..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/NavbarView.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/PersonalView.vue b/tools/obscuroscan_v2/frontend/src/views/PersonalView.vue deleted file mode 100644 index 5a31bfca7e..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/PersonalView.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/TransactionsView.vue b/tools/obscuroscan_v2/frontend/src/views/TransactionsView.vue deleted file mode 100644 index efd7042198..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/TransactionsView.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/tools/obscuroscan_v2/frontend/src/views/VerifiedData.vue b/tools/obscuroscan_v2/frontend/src/views/VerifiedData.vue deleted file mode 100644 index 9b11d4eacc..0000000000 --- a/tools/obscuroscan_v2/frontend/src/views/VerifiedData.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - - diff --git a/tools/obscuroscan_v2/frontend/vite.config.js b/tools/obscuroscan_v2/frontend/vite.config.js deleted file mode 100644 index ed7848aca9..0000000000 --- a/tools/obscuroscan_v2/frontend/vite.config.js +++ /dev/null @@ -1,18 +0,0 @@ -import { fileURLToPath, URL } from 'node:url' - -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - vue(), - ], - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } - } -}) - - diff --git a/tools/obscuroscan_v3/frontend/Dockerfile b/tools/obscuroscan_v3/frontend/Dockerfile deleted file mode 100644 index 9f69ba44f0..0000000000 --- a/tools/obscuroscan_v3/frontend/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM node:18-buster as runner -# setup container data structure -RUN mkdir -p /home/obscuro/go-obscuro/tools/obscuroscan_v3/ -COPY ./tools/obscuroscan_v3/frontend /home/obscuro/go-obscuro/tools/obscuroscan_v3/frontend - -WORKDIR /home/obscuro/go-obscuro/tools/obscuroscan_v3/frontend -RUN npm install - -EXPOSE 80 \ No newline at end of file diff --git a/tools/obscuroscan_v3/frontend/public/favicon.ico b/tools/obscuroscan_v3/frontend/public/favicon.ico deleted file mode 100644 index 1bb8f324a1..0000000000 Binary files a/tools/obscuroscan_v3/frontend/public/favicon.ico and /dev/null differ diff --git a/tools/obscuroscan_v2/backend/Dockerfile b/tools/tenscan/backend/Dockerfile similarity index 79% rename from tools/obscuroscan_v2/backend/Dockerfile rename to tools/tenscan/backend/Dockerfile index 4d5424bc08..b408494f0e 100644 --- a/tools/obscuroscan_v2/backend/Dockerfile +++ b/tools/tenscan/backend/Dockerfile @@ -15,9 +15,9 @@ FROM get-dependencies as build COPY . /home/obscuro/go-obscuro # build exec -WORKDIR /home/obscuro/go-obscuro/tools/obscuroscan_v2/backend/cmd +WORKDIR /home/obscuro/go-obscuro/tools/tenscan/backend/cmd RUN --mount=type=cache,target=/root/.cache/go-build \ go build -o backend -WORKDIR /home/obscuro/go-obscuro/tools/obscuroscan_v2/backend +WORKDIR /home/obscuro/go-obscuro/tools/tenscan/backend EXPOSE 80 \ No newline at end of file diff --git a/tools/obscuroscan_v2/backend/cmd/cli.go b/tools/tenscan/backend/cmd/cli.go similarity index 77% rename from tools/obscuroscan_v2/backend/cmd/cli.go rename to tools/tenscan/backend/cmd/cli.go index 2adcc1ca68..fe51f124c8 100644 --- a/tools/obscuroscan_v2/backend/cmd/cli.go +++ b/tools/tenscan/backend/cmd/cli.go @@ -3,14 +3,14 @@ package main import ( "flag" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend/config" + "github.com/ten-protocol/go-ten/tools/tenscan/backend/config" ) func parseCLIArgs() *config.Config { defaultConfig := &config.Config{ NodeHostAddress: "http://erpc.dev-testnet.obscu.ro:80", ServerAddress: "0.0.0.0:80", - LogPath: "obscuroscan_logs.txt", + LogPath: "tenscan_logs.txt", } nodeHostAddress := flag.String(nodeHostAddressName, defaultConfig.NodeHostAddress, nodeHostAddressUsage) @@ -31,8 +31,8 @@ const ( nodeHostAddressUsage = "The Obscuro Host Node address" serverAddressName = "serverAddress" - serverAddressUsage = "The address to serve Obscuroscan on" + serverAddressUsage = "The address to serve tenscan on" logPathName = "logPath" - logPathUsage = "The path to use for Obscuroscan's log file" + logPathUsage = "The path to use for tenscan's log file" ) diff --git a/tools/obscuroscan_v2/backend/cmd/main.go b/tools/tenscan/backend/cmd/main.go similarity index 77% rename from tools/obscuroscan_v2/backend/cmd/main.go rename to tools/tenscan/backend/cmd/main.go index 7abddadab9..a90f15f4e3 100644 --- a/tools/obscuroscan_v2/backend/cmd/main.go +++ b/tools/tenscan/backend/cmd/main.go @@ -8,17 +8,17 @@ import ( "os/signal" "time" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend/container" + "github.com/ten-protocol/go-ten/tools/tenscan/backend/container" ) func main() { cliConfig := parseCLIArgs() - obsScanContainer, err := container.NewObscuroScanContainer(cliConfig) + tenScanContainer, err := container.NewTenScanContainer(cliConfig) if err != nil { panic(err) } - err = obsScanContainer.Start() + err = tenScanContainer.Start() if err != nil { panic(err) } @@ -43,7 +43,7 @@ func main() { os.Exit(1) }() - err = obsScanContainer.Stop() + err = tenScanContainer.Stop() if err != nil { fmt.Printf("failed to stop gracefully - %s\n", err) os.Exit(1) diff --git a/tools/obscuroscan_v2/backend/config/config.go b/tools/tenscan/backend/config/config.go similarity index 100% rename from tools/obscuroscan_v2/backend/config/config.go rename to tools/tenscan/backend/config/config.go diff --git a/tools/obscuroscan_v2/backend/container/container.go b/tools/tenscan/backend/container/container.go similarity index 60% rename from tools/obscuroscan_v2/backend/container/container.go rename to tools/tenscan/backend/container/container.go index 7aeac74be0..1e6bfab7e1 100644 --- a/tools/obscuroscan_v2/backend/container/container.go +++ b/tools/tenscan/backend/container/container.go @@ -3,22 +3,22 @@ package container import ( "fmt" + "github.com/ten-protocol/go-ten/tools/tenscan/backend" + "github.com/ten-protocol/go-ten/tools/tenscan/backend/config" + "github.com/ten-protocol/go-ten/tools/tenscan/backend/webserver" + + gethlog "github.com/ethereum/go-ethereum/log" "github.com/ten-protocol/go-ten/go/common/log" "github.com/ten-protocol/go-ten/go/obsclient" "github.com/ten-protocol/go-ten/go/rpc" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend/config" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend/webserver" - - gethlog "github.com/ethereum/go-ethereum/log" ) -type ObscuroScanContainer struct { +type TenScanContainer struct { backend *backend.Backend webServer *webserver.WebServer } -func NewObscuroScanContainer(config *config.Config) (*ObscuroScanContainer, error) { +func NewTenScanContainer(config *config.Config) (*TenScanContainer, error) { client, err := rpc.NewNetworkClient(config.NodeHostAddress) if err != nil { return nil, fmt.Errorf("unable to connect to the obscuro node - %w", err) @@ -27,20 +27,20 @@ func NewObscuroScanContainer(config *config.Config) (*ObscuroScanContainer, erro obsClient := obsclient.NewObsClient(client) scanBackend := backend.NewBackend(obsClient) - logger := log.New(log.ObscuroscanCmp, int(gethlog.LvlInfo), config.LogPath) + logger := log.New(log.TenscanCmp, int(gethlog.LvlInfo), config.LogPath) webServer := webserver.New(scanBackend, config.ServerAddress, logger) logger.Info("Created Obscuro Scan with the following: ", "args", config) - return &ObscuroScanContainer{ + return &TenScanContainer{ backend: backend.NewBackend(obsClient), webServer: webServer, }, nil } -func (c *ObscuroScanContainer) Start() error { +func (c *TenScanContainer) Start() error { return c.webServer.Start() } -func (c *ObscuroScanContainer) Stop() error { +func (c *TenScanContainer) Stop() error { return c.webServer.Stop() } diff --git a/tools/obscuroscan_v2/backend/obscuroscan_backend.go b/tools/tenscan/backend/obscuroscan_backend.go similarity index 100% rename from tools/obscuroscan_v2/backend/obscuroscan_backend.go rename to tools/tenscan/backend/obscuroscan_backend.go diff --git a/tools/obscuroscan_v2/backend/webserver/webserver.go b/tools/tenscan/backend/webserver/webserver.go similarity index 97% rename from tools/obscuroscan_v2/backend/webserver/webserver.go rename to tools/tenscan/backend/webserver/webserver.go index 627c3e774b..871cf47901 100644 --- a/tools/obscuroscan_v2/backend/webserver/webserver.go +++ b/tools/tenscan/backend/webserver/webserver.go @@ -7,10 +7,11 @@ import ( "net/http" "time" + "github.com/ten-protocol/go-ten/tools/tenscan/backend" + "github.com/ethereum/go-ethereum/log" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" - "github.com/ten-protocol/go-ten/tools/obscuroscan_v2/backend" ) type WebServer struct { diff --git a/tools/obscuroscan_v2/backend/webserver/webserver_routes_counts.go b/tools/tenscan/backend/webserver/webserver_routes_counts.go similarity index 100% rename from tools/obscuroscan_v2/backend/webserver/webserver_routes_counts.go rename to tools/tenscan/backend/webserver/webserver_routes_counts.go diff --git a/tools/obscuroscan_v2/backend/webserver/webserver_routes_items.go b/tools/tenscan/backend/webserver/webserver_routes_items.go similarity index 100% rename from tools/obscuroscan_v2/backend/webserver/webserver_routes_items.go rename to tools/tenscan/backend/webserver/webserver_routes_items.go diff --git a/tools/obscuroscan_v3/frontend/.eslintrc.json b/tools/tenscan/frontend/.eslintrc.json similarity index 100% rename from tools/obscuroscan_v3/frontend/.eslintrc.json rename to tools/tenscan/frontend/.eslintrc.json diff --git a/tools/obscuroscan_v3/frontend/.gitignore b/tools/tenscan/frontend/.gitignore similarity index 100% rename from tools/obscuroscan_v3/frontend/.gitignore rename to tools/tenscan/frontend/.gitignore diff --git a/tools/tenscan/frontend/Dockerfile b/tools/tenscan/frontend/Dockerfile new file mode 100644 index 0000000000..3e3b16a02f --- /dev/null +++ b/tools/tenscan/frontend/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18-buster as runner +# setup container data structure +RUN mkdir -p /home/obscuro/go-obscuro/tools/tenscan/ +COPY ./tools/tenscan/frontend /home/obscuro/go-obscuro/tools/tenscan/frontend + +WORKDIR /home/obscuro/go-obscuro/tools/tenscan/frontend +RUN npm install + +EXPOSE 80 \ No newline at end of file diff --git a/tools/obscuroscan_v3/frontend/README.md b/tools/tenscan/frontend/README.md similarity index 98% rename from tools/obscuroscan_v3/frontend/README.md rename to tools/tenscan/frontend/README.md index 8132b6eaa9..cd81dea65d 100644 --- a/tools/obscuroscan_v3/frontend/README.md +++ b/tools/tenscan/frontend/README.md @@ -24,7 +24,7 @@ Tenscan is a Next.js and Tailwind CSS-powered application that serves as a Block 1. **Clone the Repository:** ```bash git clone https://github.com/ten-protocol/go-ten.git - cd go-ten/tools/obscuroscan_v3/frontend + cd go-ten/tools/tenscan/frontend ``` 2. **Install Dependencies:** diff --git a/tools/obscuroscan_v3/frontend/api/batches.ts b/tools/tenscan/frontend/api/batches.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/api/batches.ts rename to tools/tenscan/frontend/api/batches.ts diff --git a/tools/obscuroscan_v3/frontend/api/blocks.ts b/tools/tenscan/frontend/api/blocks.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/api/blocks.ts rename to tools/tenscan/frontend/api/blocks.ts diff --git a/tools/obscuroscan_v3/frontend/api/contracts.ts b/tools/tenscan/frontend/api/contracts.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/api/contracts.ts rename to tools/tenscan/frontend/api/contracts.ts diff --git a/tools/obscuroscan_v3/frontend/api/index.ts b/tools/tenscan/frontend/api/index.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/api/index.ts rename to tools/tenscan/frontend/api/index.ts diff --git a/tools/obscuroscan_v3/frontend/api/rollups.ts b/tools/tenscan/frontend/api/rollups.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/api/rollups.ts rename to tools/tenscan/frontend/api/rollups.ts diff --git a/tools/obscuroscan_v3/frontend/api/transactions.ts b/tools/tenscan/frontend/api/transactions.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/api/transactions.ts rename to tools/tenscan/frontend/api/transactions.ts diff --git a/tools/obscuroscan_v3/frontend/components.json b/tools/tenscan/frontend/components.json similarity index 100% rename from tools/obscuroscan_v3/frontend/components.json rename to tools/tenscan/frontend/components.json diff --git a/tools/obscuroscan_v3/frontend/env.example b/tools/tenscan/frontend/env.example similarity index 100% rename from tools/obscuroscan_v3/frontend/env.example rename to tools/tenscan/frontend/env.example diff --git a/tools/obscuroscan_v3/frontend/next.config.js b/tools/tenscan/frontend/next.config.js similarity index 100% rename from tools/obscuroscan_v3/frontend/next.config.js rename to tools/tenscan/frontend/next.config.js diff --git a/tools/obscuroscan_v3/frontend/package-lock.json b/tools/tenscan/frontend/package-lock.json similarity index 100% rename from tools/obscuroscan_v3/frontend/package-lock.json rename to tools/tenscan/frontend/package-lock.json diff --git a/tools/obscuroscan_v3/frontend/package.json b/tools/tenscan/frontend/package.json similarity index 100% rename from tools/obscuroscan_v3/frontend/package.json rename to tools/tenscan/frontend/package.json diff --git a/tools/obscuroscan_v3/frontend/pages/404.tsx b/tools/tenscan/frontend/pages/404.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/404.tsx rename to tools/tenscan/frontend/pages/404.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/500.tsx b/tools/tenscan/frontend/pages/500.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/500.tsx rename to tools/tenscan/frontend/pages/500.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/_app.tsx b/tools/tenscan/frontend/pages/_app.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/_app.tsx rename to tools/tenscan/frontend/pages/_app.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/_document.tsx b/tools/tenscan/frontend/pages/_document.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/_document.tsx rename to tools/tenscan/frontend/pages/_document.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/_error.tsx b/tools/tenscan/frontend/pages/_error.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/_error.tsx rename to tools/tenscan/frontend/pages/_error.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/address/[address].tsx b/tools/tenscan/frontend/pages/address/[address].tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/address/[address].tsx rename to tools/tenscan/frontend/pages/address/[address].tsx diff --git a/tools/obscuroscan_v3/frontend/pages/batches/[hash].tsx b/tools/tenscan/frontend/pages/batches/[hash].tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/batches/[hash].tsx rename to tools/tenscan/frontend/pages/batches/[hash].tsx diff --git a/tools/obscuroscan_v3/frontend/pages/batches/index.tsx b/tools/tenscan/frontend/pages/batches/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/batches/index.tsx rename to tools/tenscan/frontend/pages/batches/index.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/blocks/index.tsx b/tools/tenscan/frontend/pages/blocks/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/blocks/index.tsx rename to tools/tenscan/frontend/pages/blocks/index.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/docs/[id].tsx b/tools/tenscan/frontend/pages/docs/[id].tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/docs/[id].tsx rename to tools/tenscan/frontend/pages/docs/[id].tsx diff --git a/tools/obscuroscan_v3/frontend/pages/index.tsx b/tools/tenscan/frontend/pages/index.tsx similarity index 89% rename from tools/obscuroscan_v3/frontend/pages/index.tsx rename to tools/tenscan/frontend/pages/index.tsx index 2fde5d1991..c45044fb82 100644 --- a/tools/obscuroscan_v3/frontend/pages/index.tsx +++ b/tools/tenscan/frontend/pages/index.tsx @@ -5,7 +5,7 @@ import Dashboard from "@/src/components/modules/dashboard"; export const metadata: Metadata = { title: "Dashboard", - description: "Obscuroscan Dashboard", + description: "Tenscan Dashboard", }; export default function DashboardPage() { diff --git a/tools/obscuroscan_v3/frontend/pages/personal/index.tsx b/tools/tenscan/frontend/pages/personal/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/personal/index.tsx rename to tools/tenscan/frontend/pages/personal/index.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/resources/decrypt.tsx b/tools/tenscan/frontend/pages/resources/decrypt.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/resources/decrypt.tsx rename to tools/tenscan/frontend/pages/resources/decrypt.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/resources/verified-data.tsx b/tools/tenscan/frontend/pages/resources/verified-data.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/resources/verified-data.tsx rename to tools/tenscan/frontend/pages/resources/verified-data.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/transactions/index.tsx b/tools/tenscan/frontend/pages/transactions/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/transactions/index.tsx rename to tools/tenscan/frontend/pages/transactions/index.tsx diff --git a/tools/obscuroscan_v3/frontend/pages/tx/[hash].tsx b/tools/tenscan/frontend/pages/tx/[hash].tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/pages/tx/[hash].tsx rename to tools/tenscan/frontend/pages/tx/[hash].tsx diff --git a/tools/obscuroscan_v3/frontend/postcss.config.js b/tools/tenscan/frontend/postcss.config.js similarity index 100% rename from tools/obscuroscan_v3/frontend/postcss.config.js rename to tools/tenscan/frontend/postcss.config.js diff --git a/tools/obscuroscan_v3/frontend/public/assets/images/clock.png b/tools/tenscan/frontend/public/assets/images/clock.png similarity index 100% rename from tools/obscuroscan_v3/frontend/public/assets/images/clock.png rename to tools/tenscan/frontend/public/assets/images/clock.png diff --git a/tools/obscuroscan_v3/frontend/public/assets/images/ten.svg b/tools/tenscan/frontend/public/assets/images/ten.svg similarity index 100% rename from tools/obscuroscan_v3/frontend/public/assets/images/ten.svg rename to tools/tenscan/frontend/public/assets/images/ten.svg diff --git a/tools/obscuroscan_v3/frontend/public/docs/privacy.json b/tools/tenscan/frontend/public/docs/privacy.json similarity index 100% rename from tools/obscuroscan_v3/frontend/public/docs/privacy.json rename to tools/tenscan/frontend/public/docs/privacy.json diff --git a/tools/obscuroscan_v3/frontend/public/docs/terms.json b/tools/tenscan/frontend/public/docs/terms.json similarity index 100% rename from tools/obscuroscan_v3/frontend/public/docs/terms.json rename to tools/tenscan/frontend/public/docs/terms.json diff --git a/tools/obscuroscan_v2/frontend/public/favicon.ico b/tools/tenscan/frontend/public/favicon.ico similarity index 100% rename from tools/obscuroscan_v2/frontend/public/favicon.ico rename to tools/tenscan/frontend/public/favicon.ico diff --git a/tools/obscuroscan_v3/frontend/public/next.svg b/tools/tenscan/frontend/public/next.svg similarity index 100% rename from tools/obscuroscan_v3/frontend/public/next.svg rename to tools/tenscan/frontend/public/next.svg diff --git a/tools/obscuroscan_v3/frontend/public/vercel.svg b/tools/tenscan/frontend/public/vercel.svg similarity index 100% rename from tools/obscuroscan_v3/frontend/public/vercel.svg rename to tools/tenscan/frontend/public/vercel.svg diff --git a/tools/obscuroscan_v3/frontend/src/components/date-range-picker.tsx b/tools/tenscan/frontend/src/components/date-range-picker.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/date-range-picker.tsx rename to tools/tenscan/frontend/src/components/date-range-picker.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/head-seo.tsx b/tools/tenscan/frontend/src/components/head-seo.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/head-seo.tsx rename to tools/tenscan/frontend/src/components/head-seo.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/layouts/default-layout.tsx b/tools/tenscan/frontend/src/components/layouts/default-layout.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/layouts/default-layout.tsx rename to tools/tenscan/frontend/src/components/layouts/default-layout.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/layouts/footer.tsx b/tools/tenscan/frontend/src/components/layouts/footer.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/layouts/footer.tsx rename to tools/tenscan/frontend/src/components/layouts/footer.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/layouts/header.tsx b/tools/tenscan/frontend/src/components/layouts/header.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/layouts/header.tsx rename to tools/tenscan/frontend/src/components/layouts/header.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/main-nav.tsx b/tools/tenscan/frontend/src/components/main-nav.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/main-nav.tsx rename to tools/tenscan/frontend/src/components/main-nav.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/mode-toggle.tsx b/tools/tenscan/frontend/src/components/mode-toggle.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/mode-toggle.tsx rename to tools/tenscan/frontend/src/components/mode-toggle.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/batches/batch-details.tsx b/tools/tenscan/frontend/src/components/modules/batches/batch-details.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/batches/batch-details.tsx rename to tools/tenscan/frontend/src/components/modules/batches/batch-details.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/batches/columns.tsx b/tools/tenscan/frontend/src/components/modules/batches/columns.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/batches/columns.tsx rename to tools/tenscan/frontend/src/components/modules/batches/columns.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/batches/constants.tsx b/tools/tenscan/frontend/src/components/modules/batches/constants.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/batches/constants.tsx rename to tools/tenscan/frontend/src/components/modules/batches/constants.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/blocks/columns.tsx b/tools/tenscan/frontend/src/components/modules/blocks/columns.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/blocks/columns.tsx rename to tools/tenscan/frontend/src/components/modules/blocks/columns.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/blocks/constants.tsx b/tools/tenscan/frontend/src/components/modules/blocks/constants.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/blocks/constants.tsx rename to tools/tenscan/frontend/src/components/modules/blocks/constants.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/connect-wallet.tsx b/tools/tenscan/frontend/src/components/modules/common/connect-wallet.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/connect-wallet.tsx rename to tools/tenscan/frontend/src/components/modules/common/connect-wallet.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/copy.tsx b/tools/tenscan/frontend/src/components/modules/common/copy.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/copy.tsx rename to tools/tenscan/frontend/src/components/modules/common/copy.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-column-header.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table-column-header.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-column-header.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table-column-header.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-faceted-filter.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table-faceted-filter.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-faceted-filter.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table-faceted-filter.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-pagination.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table-pagination.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-pagination.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table-pagination.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-row-actions.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table-row-actions.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-row-actions.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table-row-actions.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-toolbar.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table-toolbar.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-toolbar.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table-toolbar.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-view-options.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table-view-options.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table-view-options.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table-view-options.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/data-table.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/data-table.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/data-table.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/skeleton-loader.tsx b/tools/tenscan/frontend/src/components/modules/common/data-table/skeleton-loader.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/data-table/skeleton-loader.tsx rename to tools/tenscan/frontend/src/components/modules/common/data-table/skeleton-loader.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/empty-state.tsx b/tools/tenscan/frontend/src/components/modules/common/empty-state.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/empty-state.tsx rename to tools/tenscan/frontend/src/components/modules/common/empty-state.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/network-status.tsx b/tools/tenscan/frontend/src/components/modules/common/network-status.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/network-status.tsx rename to tools/tenscan/frontend/src/components/modules/common/network-status.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/common/truncated-address.tsx b/tools/tenscan/frontend/src/components/modules/common/truncated-address.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/common/truncated-address.tsx rename to tools/tenscan/frontend/src/components/modules/common/truncated-address.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/dashboard/analytics-card.tsx b/tools/tenscan/frontend/src/components/modules/dashboard/analytics-card.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/dashboard/analytics-card.tsx rename to tools/tenscan/frontend/src/components/modules/dashboard/analytics-card.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/dashboard/index.tsx b/tools/tenscan/frontend/src/components/modules/dashboard/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/dashboard/index.tsx rename to tools/tenscan/frontend/src/components/modules/dashboard/index.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/dashboard/recent-batches.tsx b/tools/tenscan/frontend/src/components/modules/dashboard/recent-batches.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/dashboard/recent-batches.tsx rename to tools/tenscan/frontend/src/components/modules/dashboard/recent-batches.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/dashboard/recent-blocks.tsx b/tools/tenscan/frontend/src/components/modules/dashboard/recent-blocks.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/dashboard/recent-blocks.tsx rename to tools/tenscan/frontend/src/components/modules/dashboard/recent-blocks.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/dashboard/recent-transactions.tsx b/tools/tenscan/frontend/src/components/modules/dashboard/recent-transactions.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/dashboard/recent-transactions.tsx rename to tools/tenscan/frontend/src/components/modules/dashboard/recent-transactions.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/personal/columns.tsx b/tools/tenscan/frontend/src/components/modules/personal/columns.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/personal/columns.tsx rename to tools/tenscan/frontend/src/components/modules/personal/columns.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/personal/data.tsx b/tools/tenscan/frontend/src/components/modules/personal/data.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/personal/data.tsx rename to tools/tenscan/frontend/src/components/modules/personal/data.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/personal/index.tsx b/tools/tenscan/frontend/src/components/modules/personal/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/personal/index.tsx rename to tools/tenscan/frontend/src/components/modules/personal/index.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/resources/decrypt.tsx b/tools/tenscan/frontend/src/components/modules/resources/decrypt.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/resources/decrypt.tsx rename to tools/tenscan/frontend/src/components/modules/resources/decrypt.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/resources/verified-data/VerifiedContracts.tsx b/tools/tenscan/frontend/src/components/modules/resources/verified-data/VerifiedContracts.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/resources/verified-data/VerifiedContracts.tsx rename to tools/tenscan/frontend/src/components/modules/resources/verified-data/VerifiedContracts.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/resources/verified-data/VerifiedSequencerData.tsx b/tools/tenscan/frontend/src/components/modules/resources/verified-data/VerifiedSequencerData.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/resources/verified-data/VerifiedSequencerData.tsx rename to tools/tenscan/frontend/src/components/modules/resources/verified-data/VerifiedSequencerData.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/resources/verified-data/index.tsx b/tools/tenscan/frontend/src/components/modules/resources/verified-data/index.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/resources/verified-data/index.tsx rename to tools/tenscan/frontend/src/components/modules/resources/verified-data/index.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/transactions/columns.tsx b/tools/tenscan/frontend/src/components/modules/transactions/columns.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/transactions/columns.tsx rename to tools/tenscan/frontend/src/components/modules/transactions/columns.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/modules/transactions/constants.tsx b/tools/tenscan/frontend/src/components/modules/transactions/constants.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/modules/transactions/constants.tsx rename to tools/tenscan/frontend/src/components/modules/transactions/constants.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/overview.tsx b/tools/tenscan/frontend/src/components/overview.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/overview.tsx rename to tools/tenscan/frontend/src/components/overview.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/providers/theme-provider.tsx b/tools/tenscan/frontend/src/components/providers/theme-provider.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/providers/theme-provider.tsx rename to tools/tenscan/frontend/src/components/providers/theme-provider.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/providers/wallet-provider.tsx b/tools/tenscan/frontend/src/components/providers/wallet-provider.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/providers/wallet-provider.tsx rename to tools/tenscan/frontend/src/components/providers/wallet-provider.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/search.tsx b/tools/tenscan/frontend/src/components/search.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/search.tsx rename to tools/tenscan/frontend/src/components/search.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/team-switcher.tsx b/tools/tenscan/frontend/src/components/team-switcher.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/team-switcher.tsx rename to tools/tenscan/frontend/src/components/team-switcher.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/alert.tsx b/tools/tenscan/frontend/src/components/ui/alert.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/alert.tsx rename to tools/tenscan/frontend/src/components/ui/alert.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/avatar.tsx b/tools/tenscan/frontend/src/components/ui/avatar.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/avatar.tsx rename to tools/tenscan/frontend/src/components/ui/avatar.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/badge.tsx b/tools/tenscan/frontend/src/components/ui/badge.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/badge.tsx rename to tools/tenscan/frontend/src/components/ui/badge.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/button.tsx b/tools/tenscan/frontend/src/components/ui/button.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/button.tsx rename to tools/tenscan/frontend/src/components/ui/button.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/calendar.tsx b/tools/tenscan/frontend/src/components/ui/calendar.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/calendar.tsx rename to tools/tenscan/frontend/src/components/ui/calendar.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/card.tsx b/tools/tenscan/frontend/src/components/ui/card.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/card.tsx rename to tools/tenscan/frontend/src/components/ui/card.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/checkbox.tsx b/tools/tenscan/frontend/src/components/ui/checkbox.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/checkbox.tsx rename to tools/tenscan/frontend/src/components/ui/checkbox.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/command.tsx b/tools/tenscan/frontend/src/components/ui/command.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/command.tsx rename to tools/tenscan/frontend/src/components/ui/command.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/dialog.tsx b/tools/tenscan/frontend/src/components/ui/dialog.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/dialog.tsx rename to tools/tenscan/frontend/src/components/ui/dialog.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/dropdown-menu.tsx b/tools/tenscan/frontend/src/components/ui/dropdown-menu.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/dropdown-menu.tsx rename to tools/tenscan/frontend/src/components/ui/dropdown-menu.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/external-link.tsx b/tools/tenscan/frontend/src/components/ui/external-link.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/external-link.tsx rename to tools/tenscan/frontend/src/components/ui/external-link.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/input.tsx b/tools/tenscan/frontend/src/components/ui/input.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/input.tsx rename to tools/tenscan/frontend/src/components/ui/input.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/key-value.tsx b/tools/tenscan/frontend/src/components/ui/key-value.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/key-value.tsx rename to tools/tenscan/frontend/src/components/ui/key-value.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/label.tsx b/tools/tenscan/frontend/src/components/ui/label.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/label.tsx rename to tools/tenscan/frontend/src/components/ui/label.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/navigation-menu.tsx b/tools/tenscan/frontend/src/components/ui/navigation-menu.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/navigation-menu.tsx rename to tools/tenscan/frontend/src/components/ui/navigation-menu.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/popover.tsx b/tools/tenscan/frontend/src/components/ui/popover.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/popover.tsx rename to tools/tenscan/frontend/src/components/ui/popover.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/select.tsx b/tools/tenscan/frontend/src/components/ui/select.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/select.tsx rename to tools/tenscan/frontend/src/components/ui/select.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/separator.tsx b/tools/tenscan/frontend/src/components/ui/separator.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/separator.tsx rename to tools/tenscan/frontend/src/components/ui/separator.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/skeleton.tsx b/tools/tenscan/frontend/src/components/ui/skeleton.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/skeleton.tsx rename to tools/tenscan/frontend/src/components/ui/skeleton.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/spinner.tsx b/tools/tenscan/frontend/src/components/ui/spinner.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/spinner.tsx rename to tools/tenscan/frontend/src/components/ui/spinner.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/table.tsx b/tools/tenscan/frontend/src/components/ui/table.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/table.tsx rename to tools/tenscan/frontend/src/components/ui/table.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/tabs.tsx b/tools/tenscan/frontend/src/components/ui/tabs.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/tabs.tsx rename to tools/tenscan/frontend/src/components/ui/tabs.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/textarea.tsx b/tools/tenscan/frontend/src/components/ui/textarea.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/textarea.tsx rename to tools/tenscan/frontend/src/components/ui/textarea.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/toast.tsx b/tools/tenscan/frontend/src/components/ui/toast.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/toast.tsx rename to tools/tenscan/frontend/src/components/ui/toast.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/toaster.tsx b/tools/tenscan/frontend/src/components/ui/toaster.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/toaster.tsx rename to tools/tenscan/frontend/src/components/ui/toaster.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/tooltip.tsx b/tools/tenscan/frontend/src/components/ui/tooltip.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/tooltip.tsx rename to tools/tenscan/frontend/src/components/ui/tooltip.tsx diff --git a/tools/obscuroscan_v3/frontend/src/components/ui/use-toast.ts b/tools/tenscan/frontend/src/components/ui/use-toast.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/ui/use-toast.ts rename to tools/tenscan/frontend/src/components/ui/use-toast.ts diff --git a/tools/obscuroscan_v3/frontend/src/components/user-nav.tsx b/tools/tenscan/frontend/src/components/user-nav.tsx similarity index 100% rename from tools/obscuroscan_v3/frontend/src/components/user-nav.tsx rename to tools/tenscan/frontend/src/components/user-nav.tsx diff --git a/tools/obscuroscan_v3/frontend/src/hooks/useCopy.ts b/tools/tenscan/frontend/src/hooks/useCopy.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/hooks/useCopy.ts rename to tools/tenscan/frontend/src/hooks/useCopy.ts diff --git a/tools/obscuroscan_v3/frontend/src/lib/constants.ts b/tools/tenscan/frontend/src/lib/constants.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/lib/constants.ts rename to tools/tenscan/frontend/src/lib/constants.ts diff --git a/tools/obscuroscan_v3/frontend/src/lib/siteMetadata.ts b/tools/tenscan/frontend/src/lib/siteMetadata.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/lib/siteMetadata.ts rename to tools/tenscan/frontend/src/lib/siteMetadata.ts diff --git a/tools/obscuroscan_v3/frontend/src/lib/utils.ts b/tools/tenscan/frontend/src/lib/utils.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/lib/utils.ts rename to tools/tenscan/frontend/src/lib/utils.ts diff --git a/tools/obscuroscan_v3/frontend/src/routes/index.ts b/tools/tenscan/frontend/src/routes/index.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/routes/index.ts rename to tools/tenscan/frontend/src/routes/index.ts diff --git a/tools/obscuroscan_v3/frontend/src/routes/router.ts b/tools/tenscan/frontend/src/routes/router.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/routes/router.ts rename to tools/tenscan/frontend/src/routes/router.ts diff --git a/tools/obscuroscan_v3/frontend/src/services/useBatchesService.ts b/tools/tenscan/frontend/src/services/useBatchesService.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/services/useBatchesService.ts rename to tools/tenscan/frontend/src/services/useBatchesService.ts diff --git a/tools/obscuroscan_v3/frontend/src/services/useBlocksService.ts b/tools/tenscan/frontend/src/services/useBlocksService.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/services/useBlocksService.ts rename to tools/tenscan/frontend/src/services/useBlocksService.ts diff --git a/tools/obscuroscan_v3/frontend/src/services/useContractsService.ts b/tools/tenscan/frontend/src/services/useContractsService.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/services/useContractsService.ts rename to tools/tenscan/frontend/src/services/useContractsService.ts diff --git a/tools/obscuroscan_v3/frontend/src/services/useRollupsService.ts b/tools/tenscan/frontend/src/services/useRollupsService.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/services/useRollupsService.ts rename to tools/tenscan/frontend/src/services/useRollupsService.ts diff --git a/tools/obscuroscan_v3/frontend/src/services/useTransactionsService.ts b/tools/tenscan/frontend/src/services/useTransactionsService.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/services/useTransactionsService.ts rename to tools/tenscan/frontend/src/services/useTransactionsService.ts diff --git a/tools/obscuroscan_v3/frontend/src/types/interfaces/BatchInterfaces.ts b/tools/tenscan/frontend/src/types/interfaces/BatchInterfaces.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/types/interfaces/BatchInterfaces.ts rename to tools/tenscan/frontend/src/types/interfaces/BatchInterfaces.ts diff --git a/tools/obscuroscan_v3/frontend/src/types/interfaces/BlockInterfaces.ts b/tools/tenscan/frontend/src/types/interfaces/BlockInterfaces.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/types/interfaces/BlockInterfaces.ts rename to tools/tenscan/frontend/src/types/interfaces/BlockInterfaces.ts diff --git a/tools/obscuroscan_v3/frontend/src/types/interfaces/ContractInterface.ts b/tools/tenscan/frontend/src/types/interfaces/ContractInterface.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/types/interfaces/ContractInterface.ts rename to tools/tenscan/frontend/src/types/interfaces/ContractInterface.ts diff --git a/tools/obscuroscan_v3/frontend/src/types/interfaces/TransactionInterfaces.ts b/tools/tenscan/frontend/src/types/interfaces/TransactionInterfaces.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/types/interfaces/TransactionInterfaces.ts rename to tools/tenscan/frontend/src/types/interfaces/TransactionInterfaces.ts diff --git a/tools/obscuroscan_v3/frontend/src/types/interfaces/WalletInterfaces.ts b/tools/tenscan/frontend/src/types/interfaces/WalletInterfaces.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/types/interfaces/WalletInterfaces.ts rename to tools/tenscan/frontend/src/types/interfaces/WalletInterfaces.ts diff --git a/tools/obscuroscan_v3/frontend/src/types/interfaces/index.ts b/tools/tenscan/frontend/src/types/interfaces/index.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/src/types/interfaces/index.ts rename to tools/tenscan/frontend/src/types/interfaces/index.ts diff --git a/tools/obscuroscan_v3/frontend/styles/fonts/CloudSoft-Bold_700.otf b/tools/tenscan/frontend/styles/fonts/CloudSoft-Bold_700.otf similarity index 100% rename from tools/obscuroscan_v3/frontend/styles/fonts/CloudSoft-Bold_700.otf rename to tools/tenscan/frontend/styles/fonts/CloudSoft-Bold_700.otf diff --git a/tools/obscuroscan_v3/frontend/styles/fonts/CloudSoft-Light_300.otf b/tools/tenscan/frontend/styles/fonts/CloudSoft-Light_300.otf similarity index 100% rename from tools/obscuroscan_v3/frontend/styles/fonts/CloudSoft-Light_300.otf rename to tools/tenscan/frontend/styles/fonts/CloudSoft-Light_300.otf diff --git a/tools/obscuroscan_v3/frontend/styles/fonts/README.txt b/tools/tenscan/frontend/styles/fonts/README.txt similarity index 100% rename from tools/obscuroscan_v3/frontend/styles/fonts/README.txt rename to tools/tenscan/frontend/styles/fonts/README.txt diff --git a/tools/obscuroscan_v3/frontend/styles/globals.css b/tools/tenscan/frontend/styles/globals.css similarity index 100% rename from tools/obscuroscan_v3/frontend/styles/globals.css rename to tools/tenscan/frontend/styles/globals.css diff --git a/tools/obscuroscan_v3/frontend/tailwind.config.js b/tools/tenscan/frontend/tailwind.config.js similarity index 100% rename from tools/obscuroscan_v3/frontend/tailwind.config.js rename to tools/tenscan/frontend/tailwind.config.js diff --git a/tools/obscuroscan_v3/frontend/tailwind.config.ts b/tools/tenscan/frontend/tailwind.config.ts similarity index 100% rename from tools/obscuroscan_v3/frontend/tailwind.config.ts rename to tools/tenscan/frontend/tailwind.config.ts diff --git a/tools/obscuroscan_v3/frontend/tsconfig.json b/tools/tenscan/frontend/tsconfig.json similarity index 100% rename from tools/obscuroscan_v3/frontend/tsconfig.json rename to tools/tenscan/frontend/tsconfig.json