diff --git a/.github/workflows/pr-test-check.yaml b/.github/workflows/pr-test-check.yaml new file mode 100644 index 000000000..d58b0f683 --- /dev/null +++ b/.github/workflows/pr-test-check.yaml @@ -0,0 +1,29 @@ +name: PR test check + +on: + pull_request: + types: [opened, reopened, synchronize] + +jobs: + build-check: + strategy: + fail-fast: false + matrix: + project: [client] + runs-on: ubuntu-latest + defaults: + run: + working-directory: ${{ matrix.project }} + steps: + - uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: "16" + + - name: Install Dependencies + run: npm install + + - name: Tests Check + run: npm run test run diff --git a/api/package-lock.json b/api/package-lock.json index fde47d9c6..f3fea6386 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,12 +1,12 @@ { "name": "explorer-api", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "explorer-api", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "license": "Apache-2.0", "dependencies": { "@google-cloud/logging-winston": "^5.3.0", diff --git a/api/package.json b/api/package.json index decd39c7f..836eaf8f2 100644 --- a/api/package.json +++ b/api/package.json @@ -1,7 +1,7 @@ { "name": "explorer-api", "description": "API for Tangle Explorer", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "author": "Martyn Janes ", "repository": { "type": "git", diff --git a/api/src/models/db/networkType.ts b/api/src/models/db/networkType.ts index 1ed69e50a..1ab097ec1 100644 --- a/api/src/models/db/networkType.ts +++ b/api/src/models/db/networkType.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ const LEGACY_MAINNET = "legacy-mainnet"; const CHRYSALIS_MAINNET = "chrysalis-mainnet"; -const MAINNET = "mainnet"; +export const MAINNET = "mainnet"; const DEVNET = "devnet"; export const SHIMMER = "shimmer"; const TESTNET = "testnet"; diff --git a/api/src/routes.ts b/api/src/routes.ts index c5f2edf37..4fbceb165 100644 --- a/api/src/routes.ts +++ b/api/src/routes.ts @@ -37,6 +37,14 @@ export const routes: IRoute[] = [ folder: "chrysalis/transactionhistory", func: "get", }, + { + path: "/transactionhistory/download/:network/:address", + method: "post", + folder: "chrysalis/transactionhistory/download", + func: "post", + dataBody: true, + dataResponse: true, + }, { path: "/chrysalis/did/:network/:did/document", method: "get", diff --git a/api/src/routes/chrysalis/transactionhistory/download/post.ts b/api/src/routes/chrysalis/transactionhistory/download/post.ts new file mode 100644 index 000000000..91566911e --- /dev/null +++ b/api/src/routes/chrysalis/transactionhistory/download/post.ts @@ -0,0 +1,147 @@ +import { UnitsHelper } from "@iota/iota.js"; +import JSZip from "jszip"; +import moment from "moment"; +import { ServiceFactory } from "../../../../factories/serviceFactory"; +import logger from "../../../../logger"; +import { IDataResponse } from "../../../../models/api/IDataResponse"; +import { ITransactionHistoryDownloadBody } from "../../../../models/api/stardust/chronicle/ITransactionHistoryDownloadBody"; +import { ITransactionHistoryRequest } from "../../../../models/api/stardust/chronicle/ITransactionHistoryRequest"; +import { IConfiguration } from "../../../../models/configuration/IConfiguration"; +import { CHRYSALIS } from "../../../../models/db/protocolVersion"; +import { NetworkService } from "../../../../services/networkService"; +import { ChrysalisTangleHelper } from "../../../../utils/chrysalis/chrysalisTangleHelper"; +import { ValidationHelper } from "../../../../utils/validationHelper"; + +interface IParsedRow { + messageId: string; + transactionId: string; + referencedByMilestoneIndex: string; + milestoneTimestampReferenced: string; + timestampFormatted: string; + ledgerInclusionState: string; + conflictReason: string; + inputsCount: string; + outputsCount: string; + addressBalanceChange: string; + addressBalanceChangeFormatted: string; +} + +/** + * Download the transaction history from chronicle stardust. + * @param _ The configuration. + * @param request The request. + * @param body The request body + * @returns The response. + */ +export async function post( + _: IConfiguration, + request: ITransactionHistoryRequest, + body: ITransactionHistoryDownloadBody, +): Promise { + const networkService = ServiceFactory.get("network"); + ValidationHelper.oneOf(request.network, networkService.networkNames(), "network"); + + const networkConfig = networkService.get(request.network); + + if (networkConfig.protocolVersion !== CHRYSALIS || !networkConfig.permaNodeEndpoint || !request.address) { + return null; + } + + const transactionHistoryDownload: string = await ChrysalisTangleHelper.transactionHistoryDownload(networkConfig, request.address); + + const parsed = parseResponse(transactionHistoryDownload); + + let csvContent = `${["Timestamp", "TransactionId", "Balance changes"].join(",")}\n`; + + const filtered = parsed.body.filter((row) => { + return moment(row.milestoneTimestampReferenced).isAfter(body.targetDate); + }); + + for (const i of filtered) { + const row = [i.timestampFormatted, i.transactionId, i.addressBalanceChangeFormatted].join(","); + csvContent += `${row}\n`; + } + + const jsZip = new JSZip(); + let response: IDataResponse = null; + + try { + jsZip.file("history.csv", csvContent); + const content = await jsZip.generateAsync({ type: "nodebuffer" }); + + response = { + data: content, + contentType: "application/octet-stream", + }; + } catch (e) { + logger.error(`Failed to zip transaction history for download. Cause: ${e}`); + } + + return response; +} + +/** + * Split response into lines, format each line + * @param response The response from endpoint to parse. + * @returns Object with headers and body. + */ +function parseResponse(response: string) { + const lines = response.split("\n"); + let isHeadersSet = false; + let headers: IParsedRow; // Headers: "MessageID", "TransactionID", "ReferencedByMilestoneIndex", "MilestoneTimestampReferenced", "LedgerInclusionState", "ConflictReason", "InputsCount", "OutputsCount", "AddressBalanceChange" + const body: IParsedRow[] = []; + + for (const line of lines) { + const row = parseRow(line); + + if (row) { + if (isHeadersSet) { + body.push(row); + } else { + headers = row; + isHeadersSet = true; + } + } + } + + return { headers, body }; +} + +/** + * @param row The row to parse. + * @returns Object with parsed and formatted values. + */ +function parseRow(row: string): IParsedRow { + const cols = row.split(","); + if (!cols || cols.length < 9) { + return null; + } + + const [ + messageId, + transactionId, + referencedByMilestoneIndex, + milestoneTimestampReferenced, + ledgerInclusionState, + conflictReason, + inputsCount, + outputsCount, + addressBalanceChange, + ] = cols; + + const timestamp = milestoneTimestampReferenced.replaceAll("\"", ""); + + return { + messageId, + transactionId, + referencedByMilestoneIndex, + milestoneTimestampReferenced: timestamp, + timestampFormatted: moment(timestamp).format("YYYY-MM-DD HH:mm:ss"), + ledgerInclusionState, + conflictReason, + inputsCount, + outputsCount, + addressBalanceChange, + addressBalanceChangeFormatted: UnitsHelper.formatUnits(Number(addressBalanceChange), "Mi"), + }; +} diff --git a/api/src/routes/stardust/transactionhistory/download/post.ts b/api/src/routes/stardust/transactionhistory/download/post.ts index 355a9a7c8..cce621140 100644 --- a/api/src/routes/stardust/transactionhistory/download/post.ts +++ b/api/src/routes/stardust/transactionhistory/download/post.ts @@ -1,4 +1,4 @@ -import { OutputResponse, INodeInfoBaseToken, CommonOutput } from "@iota/sdk"; +import { CommonOutput, INodeInfoBaseToken, OutputResponse } from "@iota/sdk"; import JSZip from "jszip"; import moment from "moment"; import { ServiceFactory } from "../../../../factories/serviceFactory"; @@ -8,6 +8,8 @@ import { ITransactionHistoryDownloadBody } from "../../../../models/api/stardust import { ITransactionHistoryRequest } from "../../../../models/api/stardust/chronicle/ITransactionHistoryRequest"; import { ITransactionHistoryItem } from "../../../../models/api/stardust/chronicle/ITransactionHistoryResponse"; import { IConfiguration } from "../../../../models/configuration/IConfiguration"; +import { INetwork } from "../../../../models/db/INetwork"; +import { MAINNET } from "../../../../models/db/networkType"; import { STARDUST } from "../../../../models/db/protocolVersion"; import { NetworkService } from "../../../../services/networkService"; import { ChronicleService } from "../../../../services/stardust/chronicleService"; @@ -20,6 +22,7 @@ export interface ITransactionHistoryRecord { isGenesisByDate: boolean; isSpent: boolean; transactionId: string; + outputIdFromSupplyIncrease?: string; timestamp: number; dateFormatted: string; balanceChange: number; @@ -27,6 +30,8 @@ export interface ITransactionHistoryRecord { outputs: OutputWithDetails[]; } +const STARDUST_GENESIS_MILESTONE = 7669900; + /** * Download the transaction history from chronicle stardust. * @param _ The configuration. @@ -73,14 +78,21 @@ export async function post( }); const tokenInfo = nodeInfoService.getNodeInfo().baseToken; - const transactions = getTransactionHistoryRecords(groupOutputsByTransactionId(fulfilledOutputs), tokenInfo); + const transactions = getTransactionHistoryRecords(groupOutputsByTransactionId(fulfilledOutputs), tokenInfo, networkConfig); const headers = ["Timestamp", "TransactionId", "Balance changes"]; let csvContent = `${headers.join(",")}\n`; for (const transaction of transactions) { - const row = [transaction.dateFormatted, transaction.transactionId, transaction.balanceChangeFormatted].join(","); + let transactionCell = transaction.transactionId; + if (transaction.isGenesisByDate) { + transactionCell = `Stardust Genesis (Chrysalis): ${transactionCell}`; + if (transaction.outputIdFromSupplyIncrease) { + transactionCell = `Supply Increase Output: ${transaction.outputIdFromSupplyIncrease}`; + } + } + const row = [transaction.dateFormatted, transactionCell, transaction.balanceChangeFormatted].join(","); csvContent += `${row}\n`; } @@ -140,21 +152,26 @@ export const groupOutputsByTransactionId = (outputsWithDetails: OutputWithDetail export const getTransactionHistoryRecords = ( transactionIdToOutputs: Map, tokenInfo: INodeInfoBaseToken, + networkConfig: INetwork, ): ITransactionHistoryRecord[] => { const calculatedTransactions: ITransactionHistoryRecord[] = []; for (const [transactionId, outputs] of transactionIdToOutputs.entries()) { const lastOutputTime = Math.max(...outputs.map((t) => t.milestoneTimestamp)); const balanceChange = calculateBalanceChange(outputs); - - const isGenesisByDate = outputs.map((t) => t.milestoneTimestamp).includes(0); - const isSpent = balanceChange <= 0; + const isGenesisByDate = outputs.some((output) => output.milestoneIndex === STARDUST_GENESIS_MILESTONE); + + let outputIdFromSupplyIncrease; + if (isGenesisByDate) { + outputIdFromSupplyIncrease = getStardustGenesisOutputId(outputs, networkConfig, transactionId); + } calculatedTransactions.push({ isGenesisByDate, isSpent, transactionId, + outputIdFromSupplyIncrease, timestamp: lastOutputTime, dateFormatted: moment(lastOutputTime * 1000).format("YYYY-MM-DD HH:mm:ss"), balanceChange, @@ -165,6 +182,28 @@ export const getTransactionHistoryRecords = ( return calculatedTransactions; }; +/** + * Get the output id from the stardust genesis. + * @param outputs List of outputs related to transaction + * @param networkConfig Network configuration + * @param transactionId Current trancaction + * @returns The output id from the stardust genesis or undefined. + */ +function getStardustGenesisOutputId(outputs: OutputWithDetails[], networkConfig: INetwork, transactionId: string): string | undefined { + const STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER = "0xb191c4bc825ac6983789e50545d5ef07a1d293a98ad974fc9498cb18"; + + const outputFromStardustGenesis = outputs.find((output) => { + if ( + networkConfig.network === MAINNET && + output.milestoneIndex === STARDUST_GENESIS_MILESTONE && + transactionId.includes(STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER) + ) { + return true; + } + }); + return outputFromStardustGenesis?.outputId; +} + export const calculateBalanceChange = (outputs: OutputWithDetails[]) => { let totalAmount = 0; diff --git a/api/src/services/stardust/influx/influxQueries.ts b/api/src/services/stardust/influx/influxQueries.ts index 6ae4ffde5..ac7ba6f2a 100644 --- a/api/src/services/stardust/influx/influxQueries.ts +++ b/api/src/services/stardust/influx/influxQueries.ts @@ -279,14 +279,14 @@ export const LEDGER_SIZE_DAILY_QUERY = { export const STORAGE_DEPOSIT_DAILY_QUERY = { full: ` SELECT - last("total_storage_deposit_amount") * 100 / 1000000 AS "storageDeposit" + last("total_storage_deposit_amount") / 1000000 AS "storageDeposit" FROM "stardust_ledger_size" WHERE time < $to GROUP BY time(1d) fill(null) `, partial: ` SELECT - last("total_storage_deposit_amount") * 100 / 1000000 AS "storageDeposit" + last("total_storage_deposit_amount") / 1000000 AS "storageDeposit" FROM "stardust_ledger_size" WHERE time >= $from and time <= $to GROUP BY time(1d) fill(null) @@ -315,7 +315,7 @@ export const NFT_STAT_TOTAL_QUERY = ` export const STORAGE_DEPOSIT_TOTAL_QUERY = ` SELECT - last("total_storage_deposit_amount") * 100 AS "lockedStorageDeposit" + last("total_storage_deposit_amount") AS "lockedStorageDeposit" FROM "stardust_ledger_size"; `; diff --git a/api/src/utils/chrysalis/chrysalisTangleHelper.ts b/api/src/utils/chrysalis/chrysalisTangleHelper.ts index 4f0c9ff35..07c76bce9 100644 --- a/api/src/utils/chrysalis/chrysalisTangleHelper.ts +++ b/api/src/utils/chrysalis/chrysalisTangleHelper.ts @@ -260,6 +260,23 @@ export class ChrysalisTangleHelper { } catch {} } + /** + * Download the transaction history as csv + * @param network The network to find the items on. + * @param address Address for exporting + */ + public static async transactionHistoryDownload(network: INetwork, address: string): Promise { + try { + const csvResp = await fetch(`${network.permaNodeEndpoint}/api/core/v1/addresses/${address}/tx-history`, { + method: "GET", + headers: { + Accept: "text/csv", + }, + }); + return await csvResp.text(); + } catch {} + } + /** * Get the milestone details. * @param network The network to find the items on. diff --git a/client/package-lock.json b/client/package-lock.json index 9b06c7010..5792475e5 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "explorer-client", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "explorer-client", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -93,7 +93,7 @@ "stylelint-config-sass-guidelines": "^9.0.1", "stylelint-config-standard-scss": "^5.0.0", "typescript": "^4.9.3", - "vite": "^4.5.0", + "vite": "^4.5.2", "vite-aliases": "^0.11.3", "vite-plugin-node-polyfills": "^0.16.0", "vite-plugin-svgr": "^4.2.0", @@ -10963,7 +10963,9 @@ } }, "node_modules/vite": { - "version": "4.5.0", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "license": "MIT", "dependencies": { @@ -18863,7 +18865,9 @@ "version": "1.1.2" }, "vite": { - "version": "4.5.0", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "requires": { "esbuild": "^0.18.10", diff --git a/client/package.json b/client/package.json index 383f0bdfd..0cf510b3b 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "explorer-client", "description": "Tangle Explorer UI", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "author": "Martyn Janes ", "type": "module", "repository": { @@ -103,7 +103,7 @@ "stylelint-config-sass-guidelines": "^9.0.1", "stylelint-config-standard-scss": "^5.0.0", "typescript": "^4.9.3", - "vite": "^4.5.0", + "vite": "^4.5.2", "vite-aliases": "^0.11.3", "vite-plugin-node-polyfills": "^0.16.0", "vite-plugin-svgr": "^4.2.0", diff --git a/client/src/app/components/chrysalis/DownloadModal.scss b/client/src/app/components/chrysalis/DownloadModal.scss new file mode 100644 index 000000000..7aee50709 --- /dev/null +++ b/client/src/app/components/chrysalis/DownloadModal.scss @@ -0,0 +1,115 @@ +@import "../../../scss/fonts"; +@import "../../../scss/mixins"; +@import "../../../scss/media-queries"; +@import "../../../scss/variables"; +@import "../../../scss/themes"; + +.download-modal { + display: inline-block; + + button { + border: none; + background-color: transparent; + + &:focus { + box-shadow: none; + } + } + + .modal--icon { + span { + color: #b0bfd9; + font-size: 20px; + } + } + + .modal--bg { + position: fixed; + z-index: 2000; + top: 0; + left: 0; + width: 100%; + height: 100vh; + background: rgba(19, 31, 55, 0.75); + } + + .modal--content { + position: fixed; + z-index: 3000; + top: 50%; + left: 50%; + width: 100%; + max-width: 660px; + max-height: 100%; + padding: 32px; + transform: translate(-50%, -50%); + border: 1px solid #e8eefb; + border-radius: 6px; + background-color: var(--body-background); + box-shadow: 0 4px 8px rgba(19, 31, 55, 0.04); + + @include tablet-down { + width: 100%; + overflow-y: auto; + } + + .modal--header { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 22px; + border-bottom: 1px solid #e8eefb; + letter-spacing: 0.02em; + + .modal--title { + @include font-size(20px); + + color: var(--body-color); + font-family: $metropolis; + font-weight: 600; + } + + button { + color: var(--body-color); + } + } + + .modal--body { + margin-top: 24px; + + .input-container { + width: 100%; + + .date-label { + color: var(--body-color); + font-family: $inter; + font-weight: 500; + margin-bottom: 8px; + margin-right: 8px; + } + } + + .confirm-button { + cursor: pointer; + margin: 24px 0 8px 0; + align-self: center; + width: fit-content; + padding: 8px 12px; + border: 1px solid #ccc; + color: $mint-green-7; + + &.disabled { + color: $mint-green-1; + } + + .spinner-container { + display: flex; + align-items: center; + justify-content: center; + width: 57px; + height: 16px; + } + } + } + } +} diff --git a/client/src/app/components/chrysalis/DownloadModal.tsx b/client/src/app/components/chrysalis/DownloadModal.tsx new file mode 100644 index 000000000..87111d141 --- /dev/null +++ b/client/src/app/components/chrysalis/DownloadModal.tsx @@ -0,0 +1,117 @@ +import moment from "moment"; +import React, { useState } from "react"; +import Datetime from "react-datetime"; +// import { useTransactionHistoryDownload } from "~helpers/hooks/useTransactionHistoryDownload"; +import Spinner from "../Spinner"; +import Tooltip from "../Tooltip"; +import "./DownloadModal.scss"; +import "react-datetime/css/react-datetime.css"; +import { ServiceFactory } from "~factories/serviceFactory"; +import { ChrysalisApiClient } from "~services/chrysalis/chrysalisApiClient"; +import { CHRYSALIS } from "~models/config/protocolVersion"; +import { triggerDownload } from "~helpers/hooks/useTransactionHistoryDownload"; + +interface DownloadModalProps { + readonly network: string; + readonly address: string; +} + +const DOWNLOAD_INFO = "History will be downloaded from start date to present."; +const INITIAL_DATE = moment("2023-10-04"); + +const DownloadModal: React.FC = ({ network, address }) => { + const [apiClient] = useState(ServiceFactory.get(`api-client-${CHRYSALIS}`)); + const [isDownloading, setIsDownloading] = useState(false); + const [error, setError] = useState(); + + const [showModal, setShowModal] = useState(false); + const [date, setDate] = useState(INITIAL_DATE); + + const onDownload = async () => { + if (!date) { + setError("Please select a date"); + return; + } + + setIsDownloading(true); + try { + const response = await apiClient.transactionHistoryDownload(network, address, (date as moment.Moment).format("YYYY-MM-DD")); + + if (response.raw) { + const responseBlob = await response.raw.blob(); + + triggerDownload(responseBlob, address); + } else if (response.error) { + setError(response.error); + } + } finally { + setIsDownloading(false); + } + }; + + const onModalOpen = () => { + setShowModal(true); + }; + + const onModalClose = () => { + setDate(""); + setShowModal(false); + }; + + return ( +
+ + {showModal && ( + +
+
+
Transaction History Download
+ +
+
+
+
+
Select start date
+ +
+ info +
+
+
+
+ calendar_month + current.isBefore(moment("2023-10-05"))} + inputProps={{ placeholder: "MM/DD/YYYY" }} + timeFormat={false} + onChange={(value) => setDate(value)} + /> +
+
+ {isDownloading ? ( + + ) : ( + + )} + {error &&
{error}
} +
+
+
+ + )} +
+ ); +}; + +export default DownloadModal; diff --git a/client/src/app/components/chrysalis/Transaction.scss b/client/src/app/components/chrysalis/Transaction.scss index 12d07939e..7b8b93622 100644 --- a/client/src/app/components/chrysalis/Transaction.scss +++ b/client/src/app/components/chrysalis/Transaction.scss @@ -27,6 +27,10 @@ font-weight: 600; text-align: left; text-transform: uppercase; + + &:last-child { + text-align: right; + } } td { @@ -62,6 +66,10 @@ color: var(--expanded-color); } } + + &:last-child { + text-align: right; + } } } } diff --git a/client/src/app/components/stardust/address/section/AddressPageTabbedSections.tsx b/client/src/app/components/stardust/address/section/AddressPageTabbedSections.tsx index 71cbb1c4c..89b98a760 100644 --- a/client/src/app/components/stardust/address/section/AddressPageTabbedSections.tsx +++ b/client/src/app/components/stardust/address/section/AddressPageTabbedSections.tsx @@ -51,23 +51,27 @@ const buildDefaultTabsOptions = ( ) => ({ [DEFAULT_TABS.Transactions]: { disabled: false, + hidden: false, isLoading: isAddressHistoryLoading, infoContent: transactionHistoryMessage, }, [DEFAULT_TABS.NativeTokens]: { disabled: tokensCount === 0, + hidden: tokensCount === 0, counter: tokensCount, isLoading: isAddressOutputsLoading, infoContent: nativeTokensMessage, }, [DEFAULT_TABS.Nfts]: { disabled: nftCount === 0, + hidden: nftCount === 0, counter: nftCount, isLoading: isNftOutputsLoading, infoContent: addressNftsMessage, }, [DEFAULT_TABS.AssocOutputs]: { disabled: associatedOutputCount === 0, + hidden: associatedOutputCount === 0, counter: associatedOutputCount, isLoading: isAssociatedOutputsLoading, infoContent: associatedOuputsMessage, @@ -90,16 +94,19 @@ const buildAliasAddressTabsOptions = ( ) => ({ [ALIAS_TABS.State]: { disabled: isAliasStateTabDisabled, + hidden: isAliasStateTabDisabled, isLoading: isAliasDetailsLoading, infoContent: stateMessage, }, [ALIAS_TABS.Foundries]: { disabled: isAliasFoundriesTabDisabled, + hidden: isAliasFoundriesTabDisabled, isLoading: isAliasFoundriesLoading, infoContent: foundriesMessage, }, [ALIAS_TABS.DID]: { disabled: isAliasDIDTabDisabled, + hidden: isAliasDIDTabDisabled, isLoading: isAliasDIDLoading, infoContent: didMessage, }, @@ -108,6 +115,7 @@ const buildAliasAddressTabsOptions = ( const buildNftAddressTabsOptions = (isNftMetadataTabDisabled: boolean, isNftDetailsLoading: boolean) => ({ [NFT_TABS.NftMetadata]: { disabled: isNftMetadataTabDisabled, + hidden: isNftMetadataTabDisabled, isLoading: isNftDetailsLoading, infoContent: nftMetadataMessage, }, @@ -228,6 +236,7 @@ export const AddressPageTabbedSections: React.FC = ({ network, addres {transactions?.map((c, idx) => ( - + ))} diff --git a/client/src/app/components/stardust/history/TransactionIdView.tsx b/client/src/app/components/stardust/history/TransactionIdView.tsx index 7b32149ef..9e339f9c3 100644 --- a/client/src/app/components/stardust/history/TransactionIdView.tsx +++ b/client/src/app/components/stardust/history/TransactionIdView.tsx @@ -1,5 +1,6 @@ import React from "react"; -import { STARDUST_SUPPLY_INCREASE_TRANSACTION_ID } from "~/helpers/stardust/transactionsHelper"; +import { Link } from "react-router-dom"; +import { STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER } from "~/helpers/stardust/transactionsHelper"; import TruncatedId from "../TruncatedId"; import Tooltip from "../../Tooltip"; @@ -10,21 +11,23 @@ export interface ITransactionIdProps { } const TransactionIdView: React.FC = ({ transactionId, isTransactionFromStardustGenesis, transactionLink }) => { + if (isTransactionFromStardustGenesis && transactionId.includes(STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER)) { + return ( + + Supply Increase + + ); + } + return ( <> - {isTransactionFromStardustGenesis && transactionId.includes(STARDUST_SUPPLY_INCREASE_TRANSACTION_ID) ? ( - Stardust Genesis - ) : ( - <> - - {isTransactionFromStardustGenesis && ( - - - warning - - - )} - + + {isTransactionFromStardustGenesis && ( + + + warning + + )} ); diff --git a/client/src/app/components/stardust/history/transactionHistoryUtils.ts b/client/src/app/components/stardust/history/transactionHistoryUtils.ts index d58f4ad2a..9daae449a 100644 --- a/client/src/app/components/stardust/history/transactionHistoryUtils.ts +++ b/client/src/app/components/stardust/history/transactionHistoryUtils.ts @@ -3,7 +3,7 @@ import moment from "moment/moment"; import { DateHelper } from "~helpers/dateHelper"; import { OutputWithDetails } from "~helpers/stardust/hooks/useAddressHistory"; -import { STARDUST_SUPPLY_INCREASE_TRANSACTION_ID, TransactionsHelper } from "~helpers/stardust/transactionsHelper"; +import { STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER, TransactionsHelper } from "~helpers/stardust/transactionsHelper"; import { formatAmount } from "~helpers/stardust/valueFormatHelper"; import { CHRYSALIS_MAINNET } from "~models/config/networkType"; @@ -64,12 +64,17 @@ export const getTransactionHistoryRecords = ( const isGenesisByDate = outputs.map((t) => t.milestoneTimestamp).some((milestoneTimestamp) => milestoneTimestamp === 0); - const milestoneIndexes = outputs.map((t) => t.milestoneIndex); - const isTransactionFromStardustGenesis = milestoneIndexes.some((milestoneIndex) => - TransactionsHelper.isTransactionFromIotaStardustGenesis(network, milestoneIndex), - ); + let stardustGenesisOutputId; + const isTransactionFromStardustGenesis = outputs.some(({ milestoneIndex, outputId }) => { + const isGenesis = TransactionsHelper.isTransactionFromIotaStardustGenesis(network, milestoneIndex); + if (isGenesis) { + stardustGenesisOutputId = outputId; + } + + return isGenesis; + }); - const transactionLink = getTransactionLink(network, transactionId, isTransactionFromStardustGenesis); + const transactionLink = getTransactionLink(network, transactionId, isTransactionFromStardustGenesis, stardustGenesisOutputId); const isSpent = balanceChange <= 0; @@ -106,8 +111,19 @@ export const calculateBalanceChange = (outputs: OutputWithDetails[]) => { }, 0); }; -export const getTransactionLink = (network: string, transactionId: string, isTransactionFromStardustGenesis: boolean) => { - return isTransactionFromStardustGenesis && !transactionId.includes(STARDUST_SUPPLY_INCREASE_TRANSACTION_ID) - ? `/${CHRYSALIS_MAINNET}/search/${transactionId}` - : `/${network}/transaction/${transactionId}`; +export const getTransactionLink = ( + network: string, + transactionId: string, + isTransactionFromStardustGenesis: boolean, + outputId?: string, +) => { + if (isTransactionFromStardustGenesis && transactionId.includes(STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER)) { + return `/${network}/output/${outputId}`; + } + + if (isTransactionFromStardustGenesis && !transactionId.includes(STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER)) { + return `/${CHRYSALIS_MAINNET}/search/${transactionId}`; + } + + return `/${network}/transaction/${transactionId}`; }; diff --git a/client/src/app/components/stardust/statistics/InfluxChartsTab.tsx b/client/src/app/components/stardust/statistics/InfluxChartsTab.tsx index 54ccc5d3b..4cdcba92f 100644 --- a/client/src/app/components/stardust/statistics/InfluxChartsTab.tsx +++ b/client/src/app/components/stardust/statistics/InfluxChartsTab.tsx @@ -10,10 +10,12 @@ import { idGenerator } from "~helpers/stardust/statisticsUtils"; import { formatAmount } from "~helpers/stardust/valueFormatHelper"; import NetworkContext from "../../../context/NetworkContext"; import { COMMAS_REGEX } from "../../../routes/stardust/landing/ShimmerClaimedUtils"; +import { SHIMMER } from "~/models/config/networkType"; import Modal from "../../Modal"; export const InfluxChartsTab: React.FC = () => { - const { tokenInfo } = useContext(NetworkContext); + const { name: networkName, tokenInfo } = useContext(NetworkContext); + const [ transactions, dailyBlocks, @@ -38,6 +40,8 @@ export const InfluxChartsTab: React.FC = () => { const ids = idGenerator(); + const isShimmerNetwork = networkName === SHIMMER; + return (
@@ -185,30 +189,32 @@ export const InfluxChartsTab: React.FC = () => { />
-
-
-

Genesis

- -
-
- - -
-
+ {isShimmerNetwork && ( +
+
+

Genesis

+ +
+
+ + +
+
+ )}

Data Storage

diff --git a/client/src/app/routes/chrysalis/Addr.scss b/client/src/app/routes/chrysalis/Addr.scss index fa1e66853..68ac4eca4 100644 --- a/client/src/app/routes/chrysalis/Addr.scss +++ b/client/src/app/routes/chrysalis/Addr.scss @@ -233,4 +233,12 @@ flex-direction: column; } } + + .justify-between { + justify-content: space-between; + } + + .w-full { + width: 100%; + } } diff --git a/client/src/app/routes/chrysalis/Addr.tsx b/client/src/app/routes/chrysalis/Addr.tsx index 258d54362..4337c7c98 100644 --- a/client/src/app/routes/chrysalis/Addr.tsx +++ b/client/src/app/routes/chrysalis/Addr.tsx @@ -25,6 +25,7 @@ import Pagination from "../../components/Pagination"; import Spinner from "../../components/Spinner"; import { AddressRouteProps } from "../AddressRouteProps"; import "./Addr.scss"; +import DownloadModal from "~app/components/chrysalis/DownloadModal"; /** * Component which will show the address page for chrysalis and older. @@ -243,9 +244,17 @@ class Addr extends AsyncComponent, AddrSt {this.txsHistory.length > 0 && (
-
-

Transaction History

- +
+
+

Transaction History

+ +
+
+ +
{this.state.status && (
diff --git a/client/src/app/routes/stardust/OutputPage.tsx b/client/src/app/routes/stardust/OutputPage.tsx index ea677be6f..f6f948e55 100644 --- a/client/src/app/routes/stardust/OutputPage.tsx +++ b/client/src/app/routes/stardust/OutputPage.tsx @@ -51,7 +51,7 @@ const OutputPage: React.FC> = ({ } = outputMetadata ?? {}; const isTransactionFromStardustGenesis = TransactionsHelper.isTransactionFromIotaStardustGenesis(network, milestoneIndexBooked ?? 0); - const transactionLink = getTransactionLink(network, transactionId ?? "", isTransactionFromStardustGenesis); + const transactionLink = getTransactionLink(network, transactionId ?? "", isTransactionFromStardustGenesis, outputId); return ( (output && ( diff --git a/client/src/app/routes/stardust/landing/AnalyticStats.tsx b/client/src/app/routes/stardust/landing/AnalyticStats.tsx index 0b22b5567..8fdedeb08 100644 --- a/client/src/app/routes/stardust/landing/AnalyticStats.tsx +++ b/client/src/app/routes/stardust/landing/AnalyticStats.tsx @@ -19,9 +19,9 @@ const AnalyticStats: React.FC = ({ analytics, circulatingSup let claimedAndPercentLabels: [string, string] | undefined; if (analytics?.unclaimedShimmer && circulatingSupply) { - // magic number since influx doesn't account for the unclaimable portion of 20% - const shimmerClaimed = circulatingSupply - (Number.parseInt(analytics.unclaimedShimmer, 10) - 362724101812273); - claimedAndPercentLabels = buildShimmerClaimedStats(shimmerClaimed.toString(), String(circulatingSupply), tokenInfo); + const totalSupplyBigInt = (BigInt(circulatingSupply) * BigInt(100)) / BigInt(80); // https://github.com/iotaledger/explorer/issues/584 + const shimmerClaimedBigInt = totalSupplyBigInt - BigInt(analytics.unclaimedShimmer); + claimedAndPercentLabels = buildShimmerClaimedStats(shimmerClaimedBigInt.toString(), totalSupplyBigInt.toString(), tokenInfo); } return analytics && !analytics.error ? ( diff --git a/client/src/helpers/stardust/hooks/useResolvedDID.ts b/client/src/helpers/stardust/hooks/useResolvedDID.ts index 857468a0a..0e14332d6 100644 --- a/client/src/helpers/stardust/hooks/useResolvedDID.ts +++ b/client/src/helpers/stardust/hooks/useResolvedDID.ts @@ -29,7 +29,7 @@ export function useResolvedDID(network: string, bech32Hrp: string, addressHex: s setidentityResponse(response); } }) - .then(() => identityService.initLibrary(window?.location?.origin ?? "" + "/wasm/identity_wasm_bg.wasm")) + .then(() => identityService.initLibrary(`${window?.location?.origin ?? ""}/wasm/identity_wasm_bg.wasm`)) .finally(() => { setIsLoading(false); }); diff --git a/client/src/helpers/stardust/hooks/useTransactionHistoryDownload.ts b/client/src/helpers/stardust/hooks/useTransactionHistoryDownload.ts index 9c12418aa..1f24baaeb 100644 --- a/client/src/helpers/stardust/hooks/useTransactionHistoryDownload.ts +++ b/client/src/helpers/stardust/hooks/useTransactionHistoryDownload.ts @@ -29,7 +29,7 @@ export function useTransactionHistoryDownload(network: string, address: string, // eslint-disable-next-line no-void void response.raw.blob().then((blob) => { if (isMounted) { - triggerDownload(blob, address); + triggerDownload(blob, `txhistory-${address}`); } }); } else if (response.error && isMounted) { @@ -48,13 +48,12 @@ export function useTransactionHistoryDownload(network: string, address: string, return [isDownloading, error]; } -const triggerDownload = (blob: Blob, address: string) => { +export const triggerDownload = (blob: Blob, filename: string) => { const url = window.URL.createObjectURL(blob); - const filename = `txhistory-${address}.zip`; const tempDlElement = document.createElement("a"); tempDlElement.href = url; - tempDlElement.download = filename; + tempDlElement.download = `${filename}.zip`; document.body.append(tempDlElement); tempDlElement.click(); tempDlElement.remove(); diff --git a/client/src/helpers/stardust/preExpandedConfig.ts b/client/src/helpers/stardust/preExpandedConfig.ts index a1badc321..c52a0d669 100644 --- a/client/src/helpers/stardust/preExpandedConfig.ts +++ b/client/src/helpers/stardust/preExpandedConfig.ts @@ -3,18 +3,16 @@ import { CommonOutput, ExpirationUnlockCondition, GovernorAddressUnlockCondition, - ReferenceUnlock, - SignatureUnlock, StateControllerAddressUnlockCondition, Unlock, UnlockConditionType, - UnlockType, Utils, } from "@iota/sdk-wasm/web"; import { Bech32AddressHelper } from "~/helpers/stardust/bech32AddressHelper"; import { IInput } from "~models/api/stardust/IInput"; import { IOutput } from "~models/api/stardust/IOutput"; import { IPreExpandedConfig } from "~models/components"; +import { resolveTransitiveUnlock } from "./resolveTransiviteUnlock"; const OUTPUT_EXPAND_CONDITIONS: UnlockConditionType[] = [ UnlockConditionType.Address, @@ -44,15 +42,10 @@ export function getInputsPreExpandedConfig(inputs: IInput[], unlocks: Unlock[], }; if (input?.output?.output && "unlockConditions" in input.output.output) { const commmonOutput = input.output.output as unknown as CommonOutput; - let unlock = unlocks[idx]; - if (unlock.type === UnlockType.Reference) { - const referenceUnlock = unlock as ReferenceUnlock; - unlock = unlocks[referenceUnlock.reference]; - } - const unlockSignatureAddress = Utils.hexPublicKeyToBech32Address( - (unlock as SignatureUnlock).signature.publicKey, - bech32Hrp, - ); + + const signatureUnlock = resolveTransitiveUnlock(unlocks, idx); + const unlockSignatureAddress = Utils.hexPublicKeyToBech32Address(signatureUnlock.signature.publicKey, bech32Hrp); + preExpandedConfig = { ...preExpandedConfig, unlockConditions: commmonOutput.unlockConditions?.map((unlockCondition) => { diff --git a/client/src/helpers/stardust/resolveTransiviteUnlock.ts b/client/src/helpers/stardust/resolveTransiviteUnlock.ts new file mode 100644 index 000000000..2e7f8d206 --- /dev/null +++ b/client/src/helpers/stardust/resolveTransiviteUnlock.ts @@ -0,0 +1,19 @@ +import { ReferenceUnlock, SignatureUnlock, Unlock, UnlockType } from "@iota/sdk-wasm/web"; + +export function resolveTransitiveUnlock(unlocks: Unlock[], unlockIndex: number): SignatureUnlock { + const unlock = unlocks[unlockIndex]; + let signatureUnlock: SignatureUnlock; + if (unlock.type === UnlockType.Signature) { + signatureUnlock = unlock as SignatureUnlock; + } else { + let refUnlockIdx = unlockIndex; + // unlock references can be transitive, + // so we need to follow the path until we find the signature + do { + const referenceUnlock = unlocks[refUnlockIdx] as ReferenceUnlock; + signatureUnlock = unlocks[referenceUnlock.reference] as SignatureUnlock; + refUnlockIdx = referenceUnlock.reference; + } while (!signatureUnlock.signature); + } + return signatureUnlock; +} diff --git a/client/src/helpers/stardust/transactionsHelper.ts b/client/src/helpers/stardust/transactionsHelper.ts index 1a04615db..2419c8bdf 100644 --- a/client/src/helpers/stardust/transactionsHelper.ts +++ b/client/src/helpers/stardust/transactionsHelper.ts @@ -13,9 +13,7 @@ import { Output, OutputType, PayloadType, - ReferenceUnlock, RegularTransactionEssence, - SignatureUnlock, StateControllerAddressUnlockCondition, TagFeature, TransactionPayload, @@ -23,7 +21,6 @@ import { Unlock, UnlockCondition, UnlockConditionType, - UnlockType, Utils, UTXOInput, } from "@iota/sdk-wasm/web"; @@ -36,6 +33,7 @@ import { IOutput } from "~models/api/stardust/IOutput"; import { MAINNET } from "~models/config/networkType"; import { StardustApiClient } from "~services/stardust/stardustApiClient"; import { Bech32AddressHelper } from "../stardust/bech32AddressHelper"; +import { resolveTransitiveUnlock } from "./resolveTransiviteUnlock"; interface TransactionInputsAndOutputsResponse { inputs: IInput[]; @@ -55,7 +53,7 @@ const HEX_PARTICIPATE = "0x5041525449434950415445"; */ export const STARDUST_GENESIS_MILESTONE = 7669900; -export const STARDUST_SUPPLY_INCREASE_TRANSACTION_ID = "0xb191c4bc825ac6983789e50545d5ef07a1d293a98ad974fc9498cb18"; +export const STARDUST_SUPPLY_INCREASE_OUTPUT_TICKER = "0xb191c4bc825ac6983789e50545d5ef07a1d293a98ad974fc9498cb18"; export class TransactionsHelper { public static async getInputsAndOutputs( @@ -82,28 +80,14 @@ export class TransactionsHelper { // unlock Addresses computed from public keys in unlocks for (let i = 0; i < unlocks.length; i++) { - const unlock = payload.unlocks[i]; - let signatureUnlock: SignatureUnlock; + const signatureUnlock = resolveTransitiveUnlock(unlocks, i); - if (unlock.type === UnlockType.Signature) { - signatureUnlock = unlock as SignatureUnlock; - } else { - let refUnlockIdx = i; - // unlock references can be transitive, - // so we need to follow the path until we find the signature - do { - const referenceUnlock = payload.unlocks[refUnlockIdx] as ReferenceUnlock; - signatureUnlock = payload.unlocks[referenceUnlock.reference] as SignatureUnlock; - refUnlockIdx = referenceUnlock.reference; - } while (!signatureUnlock.signature); - } - - unlockAddresses.push( - Bech32AddressHelper.buildAddress( - _bechHrp, - Utils.hexPublicKeyToBech32Address(signatureUnlock.signature.publicKey, _bechHrp), - ), + const address = Bech32AddressHelper.buildAddress( + _bechHrp, + Utils.hexPublicKeyToBech32Address(signatureUnlock.signature.publicKey, _bechHrp), ); + + unlockAddresses.push(address); } const payloadEssence = payload.essence as RegularTransactionEssence; diff --git a/client/src/services/chrysalis/chrysalisApiClient.ts b/client/src/services/chrysalis/chrysalisApiClient.ts index c536d8fb8..b6e43fc7d 100644 --- a/client/src/services/chrysalis/chrysalisApiClient.ts +++ b/client/src/services/chrysalis/chrysalisApiClient.ts @@ -20,6 +20,7 @@ import { IOutputDetailsRequest } from "~models/api/IOutputDetailsRequest"; import { IStatsGetRequest } from "~models/api/stats/IStatsGetRequest"; import { IStatsGetResponse } from "~models/api/stats/IStatsGetResponse"; import { ApiClient } from "../apiClient"; +import { IRawResponse } from "~models/api/IRawResponse"; /** * Class to handle api communications on chrystalis. @@ -139,4 +140,8 @@ export class ChrysalisApiClient extends ApiClient { payload, ); } + + public async transactionHistoryDownload(network: string, address: string, targetDate: string): Promise { + return this.callApiRaw(`transactionhistory/download/${network}/${address}`, "post", { targetDate }); + } } diff --git a/discord-bot/package-lock.json b/discord-bot/package-lock.json index 640761d4a..2ad63ec4a 100644 --- a/discord-bot/package-lock.json +++ b/discord-bot/package-lock.json @@ -137,14 +137,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" @@ -177,39 +178,35 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -298,21 +295,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -342,13 +348,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -397,9 +403,9 @@ "dev": true }, "node_modules/@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -409,45 +415,88 @@ } }, "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", + "node_modules/@babel/template/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/template/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/template/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/template/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/traverse": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -455,17 +504,59 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/traverse/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -476,12 +567,13 @@ } }, "node_modules/@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -560,6 +652,54 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -5026,14 +5166,15 @@ } }, "@babel/generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", - "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.14.5", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { @@ -5056,33 +5197,29 @@ } } }, - "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" - } + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true }, - "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" } }, "@babel/helper-member-expression-to-functions": { @@ -5150,18 +5287,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.22.5" } }, + "@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -5182,13 +5325,13 @@ } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -5230,59 +5373,132 @@ } }, "@babel/parser": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", - "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true } } }, "@babel/traverse": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", - "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.7", - "@babel/types": "^7.14.5", - "debug": "^4.1.0", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5292,12 +5508,13 @@ } }, "@babel/types": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", - "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -5361,6 +5578,45 @@ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "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==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/package-lock.json b/package-lock.json index 01d7aea45..3248f52ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,12 @@ { "name": "explorer", - "version": "1.0.0", + "version": "3.3.3-rc.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "explorer", + "version": "3.3.3-rc.2", "dependencies": { "husky": "^8.0.3" }, diff --git a/package.json b/package.json index 975efa9f0..01a2f33d8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "explorer", "description": "Tangle Explorer", - "version": "3.3.3-rc.1", + "version": "3.3.4-rc.1", "scripts": { "setup:client": "cd client && npm install && npm run postinstall", "setup:api": "cd api && npm install && npm run build-compile && npm run build-config",