From e297ea8b91510679e1a61300ca3194198b8cf35c Mon Sep 17 00:00:00 2001 From: Norton Andreev Date: Wed, 29 Jan 2025 16:08:04 +0200 Subject: [PATCH] explorer: Scaffold Token pages Resolves #3415 --- explorer/CHANGELOG.md | 3 + explorer/README.md | 1 + .../__tests__/transformBlock.spec.js | 4 + .../__tests__/transformTransaction.spec.js | 2 + explorer/src/lib/chain-info/chain-info.d.ts | 2 + .../lib/chain-info/transformTransaction.js | 2 + .../__snapshots__/BlocksCard.spec.js.snap | 2 +- .../__snapshots__/Navbar.spec.js.snap | 7 + .../ProvisionersCard.spec.js.snap | 2 +- .../TransactionsCard.spec.js.snap | 2 +- .../lib/components/blocks-card/BlocksCard.css | 4 - .../components/blocks-card/BlocksCard.svelte | 6 +- .../src/lib/components/data-card/DataCard.css | 5 + .../lib/components/data-card/DataCard.svelte | 2 +- explorer/src/lib/components/index.js | 6 + .../src/lib/components/navbar/Navbar.svelte | 7 +- .../provisioners-card/ProvisionersCard.svelte | 4 +- .../token-detail-item/TokenDetailItem.css | 24 ++ .../token-detail-item/TokenDetailItem.svelte | 11 + .../TokenDetailsTable.svelte | 70 ++++ .../TokenListDetails.svelte | 107 ++++++ .../token-overview/TokenOverview.css | 56 +++ .../token-overview/TokenOverview.svelte | 41 +++ .../TokenTransactionsList.svelte | 132 +++++++ .../tokens-table/TokensTable.svelte | 54 +++ .../transactions-card/TransactionsCard.css | 4 - .../transactions-card/TransactionsCard.svelte | 5 +- .../lib/mock-data/gql-token-transactions.json | 342 ++++++++++++++++++ explorer/src/lib/mock-data/index.js | 3 + explorer/src/lib/mock-data/token.d.ts | 8 + explorer/src/lib/mock-data/tokens.json | 66 ++++ explorer/src/routes/+page.svelte | 4 +- .../__snapshots__/layout.spec.js.snap | 7 + .../__tests__/__snapshots__/page.spec.js.snap | 8 +- .../__tests__/__snapshots__/page.spec.js.snap | 4 +- .../__tests__/__snapshots__/page.spec.js.snap | 4 +- explorer/src/routes/tokens/+layout.js | 9 + explorer/src/routes/tokens/+page.svelte | 50 +++ explorer/src/routes/tokens/token/+page.svelte | 95 +++++ .../__tests__/__snapshots__/page.spec.js.snap | 4 +- explorer/vite.config.js | 2 + 41 files changed, 1136 insertions(+), 35 deletions(-) delete mode 100644 explorer/src/lib/components/blocks-card/BlocksCard.css create mode 100644 explorer/src/lib/components/token-detail-item/TokenDetailItem.css create mode 100644 explorer/src/lib/components/token-detail-item/TokenDetailItem.svelte create mode 100644 explorer/src/lib/components/token-details-table/TokenDetailsTable.svelte create mode 100644 explorer/src/lib/components/token-list-details/TokenListDetails.svelte create mode 100644 explorer/src/lib/components/token-overview/TokenOverview.css create mode 100644 explorer/src/lib/components/token-overview/TokenOverview.svelte create mode 100644 explorer/src/lib/components/token-transactions-list/TokenTransactionsList.svelte create mode 100644 explorer/src/lib/components/tokens-table/TokensTable.svelte delete mode 100644 explorer/src/lib/components/transactions-card/TransactionsCard.css create mode 100644 explorer/src/lib/mock-data/gql-token-transactions.json create mode 100644 explorer/src/lib/mock-data/token.d.ts create mode 100644 explorer/src/lib/mock-data/tokens.json create mode 100644 explorer/src/routes/tokens/+layout.js create mode 100644 explorer/src/routes/tokens/+page.svelte create mode 100644 explorer/src/routes/tokens/token/+page.svelte diff --git a/explorer/CHANGELOG.md b/explorer/CHANGELOG.md index 3bb71a775b..b2ff90bc25 100644 --- a/explorer/CHANGELOG.md +++ b/explorer/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to ### Added +- Add Tokens page [#3415] + ### Changed - Replace legacy event system with RUES [#3425] @@ -148,6 +150,7 @@ and this project adheres to [#3338]: https://github.com/dusk-network/rusk/issues/3338 [#3377]: https://github.com/dusk-network/rusk/issues/3377 [#3425]: https://github.com/dusk-network/rusk/issues/3425 +[#3415]: https://github.com/dusk-network/rusk/issues/3415 diff --git a/explorer/README.md b/explorer/README.md index 4944bd2328..aa4f92c813 100644 --- a/explorer/README.md +++ b/explorer/README.md @@ -35,6 +35,7 @@ VITE_REFETCH_INTERVAL=10000 VITE_RUSK_PATH="" # Optional, set to '/rusk' for dev mode VITE_STATS_REFETCH_INTERVAL=1000 VITE_TRANSACTIONS_LIST_ENTRIES=100 +VITE_FEATURE_TOKENS=true ``` ## Environment variables and dev mode diff --git a/explorer/src/lib/chain-info/__tests__/transformBlock.spec.js b/explorer/src/lib/chain-info/__tests__/transformBlock.spec.js index a9440f3a30..cd15e216d0 100644 --- a/explorer/src/lib/chain-info/__tests__/transformBlock.spec.js +++ b/explorer/src/lib/chain-info/__tests__/transformBlock.spec.js @@ -30,12 +30,14 @@ describe("transformBlock", () => { blockheight: 495868, date: new Date(blockData.transactions[0].blockTimestamp * 1000), feepaid: 290866, + from: undefined, gaslimit: 500000000, gasprice: 1, gasspent: 290866, memo: blockData.transactions[0].tx.memo, method: "transfer", success: true, + to: undefined, txerror: "", txid: "3a3f6f90a1012ae751b4448bcb8e98def0ba2b18170239bd69fcf8e2e37f0602", txtype: "Moonlight", @@ -46,12 +48,14 @@ describe("transformBlock", () => { blockheight: 495868, date: new Date(blockData.transactions[1].blockTimestamp * 1000), feepaid: 289852, + from: undefined, gaslimit: 500000000, gasprice: 1, gasspent: 289852, memo: blockData.transactions[1].tx.memo, method: "transfer", success: true, + to: undefined, txerror: "", txid: "07bfabea1d94c16f2dc3697fa642f6cecea6e81bf76b9644efbb6e2723b76d00", txtype: "Phoenix", diff --git a/explorer/src/lib/chain-info/__tests__/transformTransaction.spec.js b/explorer/src/lib/chain-info/__tests__/transformTransaction.spec.js index 9c5c185c98..c5bc250f72 100644 --- a/explorer/src/lib/chain-info/__tests__/transformTransaction.spec.js +++ b/explorer/src/lib/chain-info/__tests__/transformTransaction.spec.js @@ -12,12 +12,14 @@ describe("transformTransaction", () => { blockheight: 487166, date: new Date(txData.blockTimestamp * 1000), feepaid: 290766, + from: undefined, gaslimit: 500000000, gasprice: 1, gasspent: 290766, memo: gqlTransaction.tx.tx.memo, method: "transfer", success: true, + to: undefined, txerror: "", txid: "4877687c2dbf154248d3ddee9ba0d81e3431f39056f82a46819da041d4ac0e04", txtype: "Moonlight", diff --git a/explorer/src/lib/chain-info/chain-info.d.ts b/explorer/src/lib/chain-info/chain-info.d.ts index be3924099b..97cee13ee6 100644 --- a/explorer/src/lib/chain-info/chain-info.d.ts +++ b/explorer/src/lib/chain-info/chain-info.d.ts @@ -35,6 +35,8 @@ type SearchResult = { }; type Transaction = { + from: string | undefined; + to: string | undefined; blockhash: string; blockheight: number; date: Date; diff --git a/explorer/src/lib/chain-info/transformTransaction.js b/explorer/src/lib/chain-info/transformTransaction.js index 53e42b315c..00e803775e 100644 --- a/explorer/src/lib/chain-info/transformTransaction.js +++ b/explorer/src/lib/chain-info/transformTransaction.js @@ -6,12 +6,14 @@ const transformTransaction = (tx) => ({ blockheight: tx.blockHeight, date: unixTsToDate(tx.blockTimestamp), feepaid: tx.gasSpent * tx.tx.gasPrice, + from: undefined, gaslimit: tx.tx.gasLimit, gasprice: tx.tx.gasPrice, gasspent: tx.gasSpent, memo: tx.tx.memo ?? "", method: tx.tx.isDeploy ? "deploy" : tx.tx.callData?.fnName ?? "transfer", success: tx.err === null, + to: undefined, txerror: tx.err ?? "", txid: tx.id, txtype: tx.tx.txType, diff --git a/explorer/src/lib/components/__tests__/__snapshots__/BlocksCard.spec.js.snap b/explorer/src/lib/components/__tests__/__snapshots__/BlocksCard.spec.js.snap index 6c588edde8..5d15072faa 100644 --- a/explorer/src/lib/components/__tests__/__snapshots__/BlocksCard.spec.js.snap +++ b/explorer/src/lib/components/__tests__/__snapshots__/BlocksCard.spec.js.snap @@ -31,7 +31,7 @@ exports[`Blocks Card > should disable the \`Show More\` button if there is no mo class="data-card__content" >
renders the Navbar component 1`] = ` > Provisioners + + + Tokens + diff --git a/explorer/src/lib/components/__tests__/__snapshots__/ProvisionersCard.spec.js.snap b/explorer/src/lib/components/__tests__/__snapshots__/ProvisionersCard.spec.js.snap index 4b52ce1989..3d671c2e8d 100644 --- a/explorer/src/lib/components/__tests__/__snapshots__/ProvisionersCard.spec.js.snap +++ b/explorer/src/lib/components/__tests__/__snapshots__/ProvisionersCard.spec.js.snap @@ -31,7 +31,7 @@ exports[`Provisioners Card > should disable the \`Show More\` button if there is class="data-card__content" >
should disable the \`Show More\` button if there is class="data-card__content" >
import { BlocksList, BlocksTable, DataCard } from "$lib/components"; - import "./BlocksCard.css"; - /** @type {Block[] | null}*/ export let blocks; @@ -50,12 +48,12 @@ }} > {#if isSmallScreen} -
+
{#each displayedBlocks as block (block)} {/each}
{:else} - + {/if} diff --git a/explorer/src/lib/components/data-card/DataCard.css b/explorer/src/lib/components/data-card/DataCard.css index bda3591005..468f582564 100644 --- a/explorer/src/lib/components/data-card/DataCard.css +++ b/explorer/src/lib/components/data-card/DataCard.css @@ -37,3 +37,8 @@ .data-card__progress-bar .dusk-progress-bar__filler { background-color: var(--primary-color); } + +.data-card__table, +.data-card__list { + overflow-y: auto; +} diff --git a/explorer/src/lib/components/data-card/DataCard.svelte b/explorer/src/lib/components/data-card/DataCard.svelte index cba1fb3bd2..129b736e3b 100644 --- a/explorer/src/lib/components/data-card/DataCard.svelte +++ b/explorer/src/lib/components/data-card/DataCard.svelte @@ -7,7 +7,7 @@ import "./DataCard.css"; - /** @type {Block[] | Transaction[] | HostProvisioner[] | Block | Transaction | null}*/ + /** @type {Block[] | Transaction[] | HostProvisioner[] | Block | Transaction | Token[] | null}*/ export let data; /** @type {Error | null}*/ diff --git a/explorer/src/lib/components/index.js b/explorer/src/lib/components/index.js index f2ea2e9319..e53a7cafd5 100644 --- a/explorer/src/lib/components/index.js +++ b/explorer/src/lib/components/index.js @@ -25,6 +25,12 @@ export { default as TransactionsCard } from "./transactions-card/TransactionsCar export { default as TransactionDetails } from "./transaction-details/TransactionDetails.svelte"; export { default as TransactionsList } from "./transactions-list/TransactionsList.svelte"; export { default as TransactionsTable } from "./transactions-table/TransactionsTable.svelte"; +export { default as TokensTable } from "./tokens-table/TokensTable.svelte"; +export { default as TokenOverview } from "./token-overview/TokenOverview.svelte"; +export { default as TokenDetailItem } from "./token-detail-item/TokenDetailItem.svelte"; +export { default as TokenDetailsTable } from "./token-details-table/TokenDetailsTable.svelte"; +export { default as TokenListDetails } from "./token-list-details/TokenListDetails.svelte"; +export { default as TokenTransactionsList } from "./token-transactions-list/TokenTransactionsList.svelte"; export { default as TransactionType } from "./transaction-type/TransactionType.svelte"; export { default as TransactionStatus } from "./transaction-status/TransactionStatus.svelte"; export { default as WorldMap } from "./world-map/WorldMap.svelte"; diff --git a/explorer/src/lib/components/navbar/Navbar.svelte b/explorer/src/lib/components/navbar/Navbar.svelte index 2d6d41a539..c941cb321f 100644 --- a/explorer/src/lib/components/navbar/Navbar.svelte +++ b/explorer/src/lib/components/navbar/Navbar.svelte @@ -22,7 +22,7 @@ /** @type {*} */ let notificationData; - const navigation = [ + let navigation = [ { link: "/", title: "Chain Info", @@ -41,6 +41,11 @@ }, ]; + $: if (import.meta.env.VITE_FEATURE_TOKENS === "true") { + navigation.push({ link: "/tokens", title: "Tokens" }); + navigation = navigation; + } + const dispatch = createEventDispatcher(); async function createEmptySpace() { diff --git a/explorer/src/lib/components/provisioners-card/ProvisionersCard.svelte b/explorer/src/lib/components/provisioners-card/ProvisionersCard.svelte index 4f53db6e02..167afdabcf 100644 --- a/explorer/src/lib/components/provisioners-card/ProvisionersCard.svelte +++ b/explorer/src/lib/components/provisioners-card/ProvisionersCard.svelte @@ -55,7 +55,7 @@ }} > {#if isSmallScreen} -
+
{#each displayedProvisioner as provisioner (provisioner)} {/each} @@ -63,7 +63,7 @@ {:else} {/if} diff --git a/explorer/src/lib/components/token-detail-item/TokenDetailItem.css b/explorer/src/lib/components/token-detail-item/TokenDetailItem.css new file mode 100644 index 0000000000..33537cf902 --- /dev/null +++ b/explorer/src/lib/components/token-detail-item/TokenDetailItem.css @@ -0,0 +1,24 @@ +.token-overview-panel__details-item { + flex: 1; + display: flex; + flex-direction: column; + justify-content: flex-start; + min-width: max-content; + margin: 0 1rem; +} + +@media (min-width: 1024px) { + .token-overview-panel__details-item:not(:last-child) { + border-right: 1px solid var(--taupe-grey); + } +} + +.token-overview-panel__details-item-title { + font-size: 1.125rem; + font-weight: 500; + margin-bottom: 0.3125rem; +} + +.token-overview-panel__details-item-subtitle { + font-size: 0.875rem; +} diff --git a/explorer/src/lib/components/token-detail-item/TokenDetailItem.svelte b/explorer/src/lib/components/token-detail-item/TokenDetailItem.svelte new file mode 100644 index 0000000000..19477d1a68 --- /dev/null +++ b/explorer/src/lib/components/token-detail-item/TokenDetailItem.svelte @@ -0,0 +1,11 @@ + + +
+

{title}

+

{subtitle}

+
diff --git a/explorer/src/lib/components/token-details-table/TokenDetailsTable.svelte b/explorer/src/lib/components/token-details-table/TokenDetailsTable.svelte new file mode 100644 index 0000000000..b02ba1758d --- /dev/null +++ b/explorer/src/lib/components/token-details-table/TokenDetailsTable.svelte @@ -0,0 +1,70 @@ + + + + +
+ + + From + To + ID + Fee (Dusk) + Status + Type + + + + {#each data as transaction (transaction)} + + {middleEllipsis( + transaction.from ? transaction.from : "", + HASH_CHARS_LENGTH + )} + {middleEllipsis( + transaction.to ? transaction.to : "", + HASH_CHARS_LENGTH + )} + {middleEllipsis(transaction.txid, HASH_CHARS_LENGTH)} + {transaction.gasprice} + + + + + + + + {/each} + +
diff --git a/explorer/src/lib/components/token-list-details/TokenListDetails.svelte b/explorer/src/lib/components/token-list-details/TokenListDetails.svelte new file mode 100644 index 0000000000..bcdb7bf5aa --- /dev/null +++ b/explorer/src/lib/components/token-list-details/TokenListDetails.svelte @@ -0,0 +1,107 @@ + + + + + + + + Token + + {data.token} + + + + + + Total Current Supply + + {data.totalCurrentSupply} + + + + + + Max Circulating Supply + + {data.maxCirculatingSupply} + + + + + + Ticker + + {data.ticker} + + + + + + Contract ID + + {tokensContractID} + + + + + + Price + + {data.price} + + + diff --git a/explorer/src/lib/components/token-overview/TokenOverview.css b/explorer/src/lib/components/token-overview/TokenOverview.css new file mode 100644 index 0000000000..256d72d99b --- /dev/null +++ b/explorer/src/lib/components/token-overview/TokenOverview.css @@ -0,0 +1,56 @@ +.token-overview-panel { + display: flex; + padding: 1rem 1.375rem; + flex-direction: column; + row-gap: 0.75rem; + border-radius: 1.5rem; + background-color: var(--surface-color); + width: 100%; + text-transform: uppercase; + position: relative; + margin-bottom: 1.25rem; +} + +.token-overview-panel__header { + display: flex; + gap: 1.25rem; + flex-direction: column; + align-items: flex-start; +} + +@media (min-width: 992px) { + .token-overview-panel__header { + flex-direction: row; + align-items: center; + } +} + +.token-overview-panel__token-name { + font-weight: 500; + font-size: 1.125em; + margin-bottom: 0.3125rem; +} + +.token-overview-panel__token-address-subheader { + font-size: 1.125em; + color: var(--text-color-secondary); +} + +.token-overview-panel__token-address { + font-weight: 500; +} + +.token-overview-panel__separator { + border: none; + border-top: 1px solid var(--taupe-grey); + margin: 0.5rem 0; +} + +.token-overview-panel__details { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; + gap: 1rem; + width: 100%; +} diff --git a/explorer/src/lib/components/token-overview/TokenOverview.svelte b/explorer/src/lib/components/token-overview/TokenOverview.svelte new file mode 100644 index 0000000000..43db48739f --- /dev/null +++ b/explorer/src/lib/components/token-overview/TokenOverview.svelte @@ -0,0 +1,41 @@ + + +
+
+ +
+

{data.token}

+

+ Address: + + {middleEllipsis( + data.contractId, + calculateAdaptiveCharCount(screenWidth, 320, 1024, 4, 30) + )} + +

+
+
+
+
+ + + +
+
diff --git a/explorer/src/lib/components/token-transactions-list/TokenTransactionsList.svelte b/explorer/src/lib/components/token-transactions-list/TokenTransactionsList.svelte new file mode 100644 index 0000000000..9ffa1231e1 --- /dev/null +++ b/explorer/src/lib/components/token-transactions-list/TokenTransactionsList.svelte @@ -0,0 +1,132 @@ + + + + + + {#if data.from} + + From + + {middleEllipsis( + data.from, + calculateAdaptiveCharCount(screenWidth, 320, 1024, 4, 25) + )} + + + {/if} + {#if data.to} + + To + + {middleEllipsis( + data.to, + calculateAdaptiveCharCount(screenWidth, 320, 1024, 4, 25) + )} + + + {/if} + + + + ID + + {middleEllipsis( + data.txid, + calculateAdaptiveCharCount(screenWidth, 320, 1024, 4, 25) + )} + + + + + + relative time + + + + + + Fee + + {formatter(luxToDusk(data.feepaid))} DUSK + + + + + + Status + + + + + + + + Type + + + + + diff --git a/explorer/src/lib/components/tokens-table/TokensTable.svelte b/explorer/src/lib/components/tokens-table/TokensTable.svelte new file mode 100644 index 0000000000..7a77af08dc --- /dev/null +++ b/explorer/src/lib/components/tokens-table/TokensTable.svelte @@ -0,0 +1,54 @@ + + + + + + + + Token + Total Current Supply + Max Circulating Supply + Ticker + Contract ID + Price ($) + + + + {#each data as token (token)} + + + {token.token} + {token.totalCurrentSupply} + {token.maxCirculatingSupply} + {token.ticker} + {middleEllipsis(token.contractId, HASH_CHARS_LENGTH)} + {token.price} + + {/each} + +
diff --git a/explorer/src/lib/components/transactions-card/TransactionsCard.css b/explorer/src/lib/components/transactions-card/TransactionsCard.css deleted file mode 100644 index a74f796afc..0000000000 --- a/explorer/src/lib/components/transactions-card/TransactionsCard.css +++ /dev/null @@ -1,4 +0,0 @@ -.transactions-card__table, -.transactions-card__list { - overflow-y: auto; -} diff --git a/explorer/src/lib/components/transactions-card/TransactionsCard.svelte b/explorer/src/lib/components/transactions-card/TransactionsCard.svelte index 1e2440f135..4d0cb0b444 100644 --- a/explorer/src/lib/components/transactions-card/TransactionsCard.svelte +++ b/explorer/src/lib/components/transactions-card/TransactionsCard.svelte @@ -7,8 +7,6 @@ TransactionsTable, } from "$lib/components"; - import "./TransactionsCard.css"; - /** @type {Transaction[] | null}*/ export let txns; @@ -54,14 +52,13 @@ }} > {#if isSmallScreen} -
+
{#each displayedTxns as txn (txn)} {/each}
{:else}
-
+
-
+
should render the app's main layout 1`] = ` > Provisioners + + + Tokens + diff --git a/explorer/src/routes/__tests__/__snapshots__/page.spec.js.snap b/explorer/src/routes/__tests__/__snapshots__/page.spec.js.snap index 368960b2e0..483036db91 100644 --- a/explorer/src/routes/__tests__/__snapshots__/page.spec.js.snap +++ b/explorer/src/routes/__tests__/__snapshots__/page.spec.js.snap @@ -4,7 +4,7 @@ exports[`home page > should render the home page, start polling for the latest c
-
should render the home page, start polling for the latest c
-
+
should render the home page, start polling for the latest c
-
should render the home page, start polling for the latest c
-
+
should render the Blocks page with the mobile layout 1`] class="data-card__content" >
should render the Blocks page, start polling for blocks a class="data-card__content" >
should render the Provisioners page with the mobile class="data-card__content" >
should render the Provisioners page, start polling class="data-card__content" >
{ + const featureTokensEnabled = import.meta.env.VITE_FEATURE_TOKENS === "true"; + + if (!featureTokensEnabled) { + throw redirect(302, "/"); + } +}; diff --git a/explorer/src/routes/tokens/+page.svelte b/explorer/src/routes/tokens/+page.svelte new file mode 100644 index 0000000000..a9037e5dbc --- /dev/null +++ b/explorer/src/routes/tokens/+page.svelte @@ -0,0 +1,50 @@ + + +
+ loadMoreItems(), + disabled: isLoadMoreDisabled, + label: "Show More", + }} + > + {#if isSmallScreen} +
+ {#each displayedTokens as token (token)} + + {/each} +
+ {:else} + + {/if} +
+
diff --git a/explorer/src/routes/tokens/token/+page.svelte b/explorer/src/routes/tokens/token/+page.svelte new file mode 100644 index 0000000000..6303cdee1b --- /dev/null +++ b/explorer/src/routes/tokens/token/+page.svelte @@ -0,0 +1,95 @@ + + +
+ {#if tokenData} +
+ +
+ loadMoreItems(), + disabled: isLoadMoreDisabled, + label: "Show More", + }} + > + {#if isSmallScreen} +
+ {#each displayedTxns as txn (txn)} + + {/each} +
+ {:else} + + {/if} +
+ {:else} +

Token not found

+ {/if} +
diff --git a/explorer/src/routes/transactions/__tests__/__snapshots__/page.spec.js.snap b/explorer/src/routes/transactions/__tests__/__snapshots__/page.spec.js.snap index d6b0684468..a1b1062b58 100644 --- a/explorer/src/routes/transactions/__tests__/__snapshots__/page.spec.js.snap +++ b/explorer/src/routes/transactions/__tests__/__snapshots__/page.spec.js.snap @@ -31,7 +31,7 @@ exports[`Transactions page > should render the Transactions page with the mobile class="data-card__content" >
should render the Transactions page, start polling class="data-card__content" >
{ API_ENDPOINT: env.VITE_API_ENDPOINT, VITE_BLOCKS_LIST_ENTRIES: env.VITE_BLOCKS_LIST_ENTRIES, VITE_CHAIN_INFO_ENTRIES: env.VITE_CHAIN_INFO_ENTRIES, + VITE_FEATURE_TOKENS: env.VITE_FEATURE_TOKENS, VITE_MARKET_DATA_REFETCH_INTERVAL: env.VITE_MARKET_DATA_REFETCH_INTERVAL, VITE_NODE_URL: env.VITE_NODE_URL, @@ -59,6 +60,7 @@ export default defineConfig(({ mode }) => { VITE_API_ENDPOINT: "https://api.dusk.network/v1", VITE_BLOCKS_LIST_ENTRIES: "100", VITE_CHAIN_INFO_ENTRIES: "15", + VITE_FEATURE_TOKENS: "true", VITE_MARKET_DATA_REFETCH_INTERVAL: "120000", VITE_NODE_URL: "https://nodes.dusk.network", VITE_PROVISIONERS_REFETCH_INTERVAL: "30000",