From 2f636e91717ea75ed97b2c4e013a37f5369ec5d9 Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Mon, 16 Dec 2024 14:28:37 -0800 Subject: [PATCH 01/56] feat: load more token holders --- .../token/[contract]/[symbol]/+page.svelte | 7 +++++++ .../(explorer)/token/[contract]/[symbol]/+page.ts | 13 +++++++++++-- .../api/token/[contract]/[symbol]/+server.ts | 5 +++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/routes/[network]/(explorer)/token/[contract]/[symbol]/+page.svelte b/src/routes/[network]/(explorer)/token/[contract]/[symbol]/+page.svelte index bc786410..ba7fd3d5 100644 --- a/src/routes/[network]/(explorer)/token/[contract]/[symbol]/+page.svelte +++ b/src/routes/[network]/(explorer)/token/[contract]/[symbol]/+page.svelte @@ -1,4 +1,5 @@ + + diff --git a/src/routes/[network]/(homepage)/+page.svelte b/src/routes/[network]/(homepage)/+page.svelte index ad64867f..eebf2938 100644 --- a/src/routes/[network]/(homepage)/+page.svelte +++ b/src/routes/[network]/(homepage)/+page.svelte @@ -6,8 +6,8 @@ import EOSPriceHistory from '$lib/components/chart/eospricehistory.svelte'; import RamPriceHistory from '$lib/components/chart/rampricehistory.svelte'; import AssetText from '$lib/components/elements/asset.svelte'; - import StakedHEX from './components/stakedhex.svelte'; + import Hero from './components/hero.svelte'; import { getContext, onMount, type Snippet } from 'svelte'; import { Asset } from '@wharfkit/antelope'; import type { HistoricalPrice } from '$lib/types'; @@ -88,56 +88,8 @@ {/snippet} - - - - -
- - -

- Unicove is your gateway to the {networkName} Network -

-

- Stake, Send, Manage Tokens, and Explore {networkName} – all with ease -

- - -
- - -
- {networkName} -
- - -
- - - -
-
+ +
@@ -349,9 +301,3 @@
- - diff --git a/src/routes/[network]/(homepage)/components/hero.svelte b/src/routes/[network]/(homepage)/components/hero.svelte new file mode 100644 index 00000000..1d137214 --- /dev/null +++ b/src/routes/[network]/(homepage)/components/hero.svelte @@ -0,0 +1,47 @@ + + +
+ + + + + + + +

+ Unicove: + Your gateway to the {networkName} Network +

+

+ Stake, Send, Manage Tokens, and Explore {networkName} – all with ease +

+ +
+
From 7a72e6bf2c26ca44a4de8d39769c4f411bceae9d Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Tue, 17 Dec 2024 14:20:20 -0800 Subject: [PATCH 05/56] fix: type errors --- src/routes/[network]/(homepage)/components/hero.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/[network]/(homepage)/components/hero.svelte b/src/routes/[network]/(homepage)/components/hero.svelte index 1d137214..5fbbdcc9 100644 --- a/src/routes/[network]/(homepage)/components/hero.svelte +++ b/src/routes/[network]/(homepage)/components/hero.svelte @@ -4,7 +4,12 @@ import bgDesktop from '$lib/assets/hero/bg1@2x.png?enhanced'; import bgMobile from '$lib/assets/hero/bg2@2x.png?enhanced'; - let { networkName, networkLogo } = $props(); + interface Props { + networkName: string; + networkLogo: string; + } + + let { networkName, networkLogo }: Props = $props();
From c1d3511b2c6cdda6a48f64f803e019655b0df28a Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:06:27 -0800 Subject: [PATCH 06/56] refactor: extract carousel to component --- src/routes/[network]/(homepage)/+page.svelte | 56 +-------------- .../(homepage)/components/carousel.svelte | 72 +++++++++++++++++++ .../(homepage)/components/text-block.svelte | 22 ++++++ 3 files changed, 96 insertions(+), 54 deletions(-) create mode 100644 src/routes/[network]/(homepage)/components/carousel.svelte create mode 100644 src/routes/[network]/(homepage)/components/text-block.svelte diff --git a/src/routes/[network]/(homepage)/+page.svelte b/src/routes/[network]/(homepage)/+page.svelte index eebf2938..dcf15e8c 100644 --- a/src/routes/[network]/(homepage)/+page.svelte +++ b/src/routes/[network]/(homepage)/+page.svelte @@ -2,7 +2,6 @@ import { Box, Card, Stack, Subgrid, Switcher } from '$lib/components/layout'; import Button from '$lib/components/button/button.svelte'; import { chainLogos } from '@wharfkit/common'; - import Metamask from '$lib/assets/metamask.svg'; import EOSPriceHistory from '$lib/components/chart/eospricehistory.svelte'; import RamPriceHistory from '$lib/components/chart/rampricehistory.svelte'; import AssetText from '$lib/components/elements/asset.svelte'; @@ -14,6 +13,7 @@ import { getAPR } from '$lib/utils/staking'; import type { UnicoveContext } from '$lib/state/client.svelte'; import { calculateValue } from '$lib/utils'; + import Carousel from './components/carousel.svelte'; const { data } = $props(); const context = getContext('state'); @@ -91,59 +91,7 @@ -
-
-
- - - - - -
- metamask - - - - {networkName} -
-
- - - {@render textblock({ - title: `The EOS Wallet for MetaMask`, - text: `MetaMask, an the industry leading self-custody wallet, is now compatible with Unicove and the ${networkName} network. Install the ${networkName} Wallet snap for MetaMask to get started.`, - button: { - text: 'Install EOS Wallet for MetaMask', - href: `/${data.network}/metamask` - } - })} - -
-
+
+ import Metamask from '$lib/assets/metamask.svg'; + import Box from '$lib/components/layout/box/box.svelte'; + import { getContext } from 'svelte'; + import type { UnicoveContext } from '$lib/state/client.svelte'; + import TextBlock from './text-block.svelte'; + + const { network } = getContext('state'); + + interface Props { + networkName: string; + networkLogo: string; + } + + let { networkName, networkLogo }: Props = $props(); + + +
+
+
+ + + + + +
+ metamask + + + + {networkName} +
+
+ + + + +
+
diff --git a/src/routes/[network]/(homepage)/components/text-block.svelte b/src/routes/[network]/(homepage)/components/text-block.svelte new file mode 100644 index 00000000..758e0661 --- /dev/null +++ b/src/routes/[network]/(homepage)/components/text-block.svelte @@ -0,0 +1,22 @@ + + + +

{props.title}

+

{props.text}

+ {#if props.button && props.button.href} + + {/if} + {@render props.children?.()} +
From 37559059c13544595d14f98b1be632b863e6b47c Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Tue, 17 Dec 2024 15:19:52 -0800 Subject: [PATCH 07/56] fix: cls issues --- src/lib/components/accountswitch.svelte | 26 +++++-------------- .../(homepage)/components/carousel.svelte | 2 ++ .../(homepage)/components/hero.svelte | 9 ++++++- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/lib/components/accountswitch.svelte b/src/lib/components/accountswitch.svelte index cee0dc98..914b5715 100644 --- a/src/lib/components/accountswitch.svelte +++ b/src/lib/components/accountswitch.svelte @@ -17,6 +17,7 @@ import PlusIcon from 'lucide-svelte/icons/plus'; import { goto } from '$app/navigation'; import { languageTag } from '$lib/paraglide/runtime'; + import { cn } from '$lib/utils/style'; const context = getContext('state'); @@ -74,27 +75,12 @@ let logo = $derived(chainLogos.get(String(context.wharf.session?.chain.id)) || ''); - - {/if} - {#if context.settings.data.advancedMode} - -

EOS Wallet Public Key (Active)

-

- - {metaMaskState.publicKey} - -

-

EOS Wallet Public Key (Owner)

-

- - {metaMaskState.ownerKey} - -

-
- {/if} {/if} {:else}

Add EOS Wallet to MetaMask

@@ -257,95 +249,163 @@ {/snippet} -
-

FAQ

-

What is a MetaMask snap?

-

- {@render link('MetaMask Snaps', 'https://metamask.io/snaps/')} are a new feature in MetaMask that - allow community built plugins to extend the functionality of the wallet beyond Ethereum based blockchains. - This means you can now access the EOS Network through MetaMask using the EOS Wallet snap. -

- -

How do I install the EOS Wallet?

-

- The EOS Wallet is a {@render link('MetaMask Snap', 'https://metamask.io/snaps/')} - you can install directly from this page on Unicove or from the EOS Wallet page in the - {@render link('MetaMask Snaps Directory', 'https://snaps.metamask.io/')}. You will need to have - MetaMask installed before adding the EOS Wallet snap. -

- -

What does the EOS Wallet do?

-

- The EOS Wallet allows you to use MetaMask as a web3 wallet for an EOS Network account. Any dApp - compatible with the EOS Wallet can be used with MetaMask. -

- -

What does the EOS Wallet not do?

-

- The EOS Wallet's only purpose is to sign transactions and will need to be paired with a - companion dApp, such as Unicove, in order to manage your account. -

- -

How do I sign transactions using the EOS Wallet?

-

- Please see our guide on - {@render link( - 'How to Sign Transactions on the EOS network with MetaMask', - 'https://support.greymass.com/a/solutions/articles/72000637277' - )} -

- -

Is the EOS Wallet free to use?

-

- Yes, the EOS Wallet software is completely free to use. However, accounts on the EOS Network - require a small amount of EOS before they are created. -

-

- Unicove is currently covering this cost and offering one free account per user. To limit abuse, - we require logging in with a valid 3rd party account. Only Apple and Google accounts are - supported at this time. -

-

Where can I view and manage my EOS account?

-

- Unicove is the first web wallet to allow you to manage your EOS account using MetaMask. We - expect other wallets will add support in the future. -

-

- You can view your account on any EOS Network block explorer, like Unicove, simply by searching - for the account name. -

- -

- Is my private key or recovery phrase exposed when using the EOS Wallet Snap? -

-

- The EOS Wallet uses a private key derived from your MetaMask seed phrase using the BIP-0044 and - the EOS coin type. This private key is only ever used for EOS accounts and the EOS Wallet cannot - access any of your other keys. The EOS Wallet never exposes this private key and does not have - access to your seed phrase. -

- -

Can I access all EOS apps?

-

- It's possible to access any EOS Network app, provided the app developers have integrated the - required SDKs. The EOS Wallet and MetaMask can be added to any web app using - {@render link('Wharf', 'https://wharfkit.com/')} - with the - {@render link('MetaMask Wallet Plugin', 'https://github.com/wharfkit/wallet-plugin-metamask')}. -

-

- Unicove itself is - {@render link('open source', 'https://github.com/greymass/2nicove')} - and serves as reference material for how this integration can be performed. -

- -

How do I reach out for EOS Wallet support?

-

If you have any issues with the EOS Wallet itself, please feel free to reach out to us at

-
- support@greymass.com -
-

- or by visiting our Support portal at - {@render link('https://support.greymass.com', 'https://support.greymass.com')} -

-
+
+
+

FAQ

+

What is a MetaMask snap?

+

+ {@render link('MetaMask Snaps', 'https://metamask.io/snaps/')} are a new feature in MetaMask that + allow community built plugins to extend the functionality of the wallet beyond Ethereum based blockchains. + This means you can now access the EOS Network through MetaMask using the EOS Wallet snap. +

+ +

How do I install the EOS Wallet?

+

+ The EOS Wallet is a {@render link('MetaMask Snap', 'https://metamask.io/snaps/')} + you can install directly from this page on Unicove or from the EOS Wallet page in the + {@render link( + 'MetaMask Snaps Directory', + 'https://snaps.metamask.io/snap/npm/greymass/eos-wallet' + )}. You will need to have + {@render link('MetaMask', 'https://metamask.io/')} + installed before adding the EOS Wallet snap. +

+ +

What does the EOS Wallet do?

+

+ The EOS Wallet allows you to use MetaMask as a web3 wallet for an EOS Network account. With it + you can sign in to EOS apps and perform transactions. +

+ +

What does the EOS Wallet not do?

+

+ The EOS Wallet's only purpose is to sign transactions and will need to be paired with a + companion dApp, such as Unicove, in order to manage your account. +

+ +

How do I sign transactions using the EOS Wallet?

+

+ Please see our guide on + {@render link( + 'How to Sign Transactions on the EOS network with MetaMask', + 'https://support.greymass.com/a/solutions/articles/72000637277' + )} +

+ +

Is the EOS Wallet free to use?

+

+ Yes, the EOS Wallet software is completely free to use. However, accounts on the EOS Network + require a small amount of EOS before they are created. +

+

+ Unicove is currently covering this cost and offering one free account per user. To limit + abuse, we require logging in with a valid 3rd party account. Only Apple and Google accounts + are supported at this time. +

+

Where can I view and manage my EOS account?

+

+ Unicove is the first web wallet to allow you to manage your EOS account using MetaMask. We + expect other wallets will add support in the future. +

+

+ You can view your account on any EOS Network block explorer, like Unicove, simply by searching + for the account name. +

+ +

+ Is my private key or recovery phrase exposed when using the EOS Wallet Snap? +

+

+ The EOS Wallet uses a private key derived from your MetaMask seed phrase using the BIP-0044 + and the EOS coin type. This private key is only ever used for EOS accounts and the EOS Wallet + cannot access any of your other keys. The EOS Wallet never exposes this private key and does + not have access to your seed phrase. +

+ +

How does MetaMask configure my owner and active keys?

+

+ The EOS Wallet derives your owner and active keys from your MetaMask seed phrase using + different indexes. The zero (0) index key is reserved for the owner key and is not available + to sign regular transactions with, while the first (1) index key is used for the active key + and available for transaction signing. +

+

+ A future update to the EOS Wallet will provide a way to use the owner key to reset the active + key, allowing for a recovery path in the event the active keys have been changed. +

+ +

How does find my owner and active keys?

+

+ The EOS Wallet provides an RPC method which returns the public keys associated with your + MetaMask seed phrase. These can be used when manually setting up a new account. Unicove can + display these keys to you if you visit the Settings page and enable Advanced Mode. +

+ +

Can I access all EOS apps using EOS Wallet for MetaMask?

+

+ It's possible to access any EOS Network app, provided the app developers have integrated the + required SDKs. The EOS Wallet and MetaMask can be added to any web app using + {@render link('Wharf', 'https://wharfkit.com/')} + with the + {@render link( + 'MetaMask Wallet Plugin', + 'https://github.com/wharfkit/wallet-plugin-metamask' + )}. +

+

+ Unicove itself is + {@render link('open source', 'https://github.com/greymass/2nicove')} + and serves as reference material for how this integration can be performed. +

+ +

How do I reach out for EOS Wallet support?

+

If you have any issues with the EOS Wallet itself, please feel free to reach out to us at

+
+ support@greymass.com +
+

or by visiting our Support portal at:

+

{@render link('https://support.greymass.com', 'https://support.greymass.com')}

+
+
+ + {#if context.settings.data.advancedMode} +

Your Public Keys

+ {#if metaMaskState.publicKey} +

MetaMask Public Key (Active)

+ + + + {/if} + {#if metaMaskState.ownerKey} +

MetaMask Public Key (Owner)

+ + + + {/if} + {/if} +

Details

+
+ +
+ EOS Wallet +
+
+ + +
+ GitHub +
+
+ {#if latestVersion} + +
+ + {latestVersion} + +
+
+ {/if} +
+
+
+
From 6f0f59ffdd8fd79ca1899dbb441a712830cf03f4 Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Tue, 17 Dec 2024 16:40:31 -0800 Subject: [PATCH 09/56] style: homepage button --- .../components/homepage-button.svelte | 21 +++++++++++++++++++ .../(homepage)/components/text-block.svelte | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/routes/[network]/(homepage)/components/homepage-button.svelte diff --git a/src/routes/[network]/(homepage)/components/homepage-button.svelte b/src/routes/[network]/(homepage)/components/homepage-button.svelte new file mode 100644 index 00000000..911dd009 --- /dev/null +++ b/src/routes/[network]/(homepage)/components/homepage-button.svelte @@ -0,0 +1,21 @@ + + + diff --git a/src/routes/[network]/(homepage)/components/text-block.svelte b/src/routes/[network]/(homepage)/components/text-block.svelte index 758e0661..6b3954af 100644 --- a/src/routes/[network]/(homepage)/components/text-block.svelte +++ b/src/routes/[network]/(homepage)/components/text-block.svelte @@ -1,5 +1,5 @@ {#snippet textblock(props: { @@ -93,48 +56,10 @@ -
- -
- -

EOS Staking Rewards

-

- Stake {data.network.chain.systemToken?.symbol.name} today for an estimated {apr}% APR1. -

-

- The {data.network.chain.name} staking rewards program proportionally distributes 85.6k {data - .network.chain.systemToken?.symbol.name} daily to token holders who have staked their tokens. - These tokens can be unstaked and will be usable against after a 21 day lockup period. -

-
- - -
-

- 1 APR is based on the total amount staked and dynamically changes over time. -

-
-
- - -
- {#if data.network.rexstate} - - {/if} -
-
+ -
+
{#if tokenPrices.length} diff --git a/src/routes/[network]/(homepage)/+page.ts b/src/routes/[network]/(homepage)/+page.ts new file mode 100644 index 00000000..a8a6fdd1 --- /dev/null +++ b/src/routes/[network]/(homepage)/+page.ts @@ -0,0 +1,38 @@ +import type { PageLoad } from './$types'; +import type { HistoricalPrice } from '$lib/types'; +import { Asset } from '@wharfkit/antelope'; + +export const load: PageLoad = async ({ fetch, parent }) => { + const { network } = await parent(); + let ramPrices: HistoricalPrice[] = []; + let tokenPrices: HistoricalPrice[] = []; + + const ramResponse: Response = await fetch(`/${network}/api/metrics/marketprice/ram`); + const parsedRamResponse: { date: string; value: number }[] | { error: string } = + await ramResponse.json(); + if ('error' in parsedRamResponse && parsedRamResponse.error) { + throw new Error(String(parsedRamResponse.error)); + } else if (Array.isArray(parsedRamResponse)) { + ramPrices = parsedRamResponse.map((price: { date: string; value: number }) => ({ + date: new Date(price.date), + value: Asset.from(price.value / 10000, network.chain.systemToken?.symbol || '0,UNKNOWN') + })); + } + + const tokenResponse: Response = await fetch(`/${network}/api/metrics/marketprice/token`); + const parsedTokenResponse: { date: string; value: number }[] | { error: string } = + await tokenResponse.json(); + if ('error' in parsedTokenResponse && parsedTokenResponse.error) { + throw new Error(String(parsedTokenResponse.error)); + } else if (Array.isArray(parsedTokenResponse)) { + tokenPrices = parsedTokenResponse.map((price: { date: string; value: number }) => ({ + date: new Date(price.date), + value: Asset.from(price.value / 10000, '4,USD') + })); + } + + return { + ramPrices, + tokenPrices + }; +}; diff --git a/src/routes/[network]/(homepage)/components/staking-rewards.svelte b/src/routes/[network]/(homepage)/components/staking-rewards.svelte new file mode 100644 index 00000000..732db775 --- /dev/null +++ b/src/routes/[network]/(homepage)/components/staking-rewards.svelte @@ -0,0 +1,51 @@ + + +
+ +
+ +

EOS Staking Rewards

+

+ Stake {network.chain.systemToken?.symbol.name} today for an estimated {apr}% APR1. +

+

+ The {network.chain.name} staking rewards program proportionally distributes 85.6k {network + .chain.systemToken?.symbol.name} daily to token holders who have staked their tokens. These + tokens can be unstaked and will be usable against after a 21 day lockup period. +

+
+
+

+ 1 APR is based on the total amount staked and dynamically changes over time. +

+
+
+ + +
+ {#if network.rexstate} + + {/if} +
+
From 0407cf9e1f3b7a35f30f3619998f9f8dc7bb8f13 Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:07:31 -0800 Subject: [PATCH 12/56] fix: button styles --- .../[network]/(homepage)/components/homepage-button.svelte | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/[network]/(homepage)/components/homepage-button.svelte b/src/routes/[network]/(homepage)/components/homepage-button.svelte index 911dd009..70939fa2 100644 --- a/src/routes/[network]/(homepage)/components/homepage-button.svelte +++ b/src/routes/[network]/(homepage)/components/homepage-button.svelte @@ -10,7 +10,10 @@ let props: Props = $props(); -
-

- 1 APR is based on the total amount staked and dynamically changes over time. -

- - +
+ + +
+ +

EOS Staking Rewards

+

+ Stake {network.chain.systemToken?.symbol.name} today for an estimated {apr}% APR1. +

+

+ The {network.chain.name} staking rewards program proportionally distributes 85.6k {network + .chain.systemToken?.symbol.name} daily to token holders who have staked their tokens. These + tokens can be unstaked and will be usable against after a 21 day lockup period. +

+
+
+

+ 1 APR is based on the total amount staked and dynamically changes over time. +

+
+
- -
- {#if network.rexstate} - - {/if} -
+ +
+ {#if network.rexstate} + + {/if} +
+
From ff68e289a591e069a843f1048192654c8636bac2 Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Tue, 17 Dec 2024 17:11:50 -0800 Subject: [PATCH 15/56] fix: typos and text length --- src/routes/[network]/(homepage)/components/carousel.svelte | 2 +- .../[network]/(homepage)/components/staking-rewards.svelte | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/[network]/(homepage)/components/carousel.svelte b/src/routes/[network]/(homepage)/components/carousel.svelte index c209a95f..0f7a9609 100644 --- a/src/routes/[network]/(homepage)/components/carousel.svelte +++ b/src/routes/[network]/(homepage)/components/carousel.svelte @@ -64,7 +64,7 @@ title: `The EOS Wallet for MetaMask`, text: `MetaMask, an the industry leading self-custody wallet, is now compatible with Unicove and the ${networkName} network. Install the ${networkName} Wallet snap for MetaMask to get started.`, button: { - text: 'Install EOS Wallet for MetaMask', + text: 'Install EOS Wallet', href: `/${network}/metamask` } }} diff --git a/src/routes/[network]/(homepage)/components/staking-rewards.svelte b/src/routes/[network]/(homepage)/components/staking-rewards.svelte index fe096fe0..9fa316dc 100644 --- a/src/routes/[network]/(homepage)/components/staking-rewards.svelte +++ b/src/routes/[network]/(homepage)/components/staking-rewards.svelte @@ -29,11 +29,11 @@

The {network.chain.name} staking rewards program proportionally distributes 85.6k {network .chain.systemToken?.symbol.name} daily to token holders who have staked their tokens. These - tokens can be unstaked and will be usable against after a 21 day lockup period. + tokens can be unstaked and will be usable again after a 21 day lockup period.

-
+

1 APR is based on the total amount staked and dynamically changes over time. From c5cac2debe3e0067b6b4e374e680d04ff8610aa9 Mon Sep 17 00:00:00 2001 From: dafuga Date: Tue, 17 Dec 2024 23:29:17 -0500 Subject: [PATCH 16/56] enhancement: implemented card design for on-ramps section --- messages/en.json | 7 ++ .../[network]/(account)/fund/+page.svelte | 95 +++++++++++++++---- static/coinbase-icon.svg | 10 ++ 3 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 static/coinbase-icon.svg diff --git a/messages/en.json b/messages/en.json index c07b3b06..8efb6637 100644 --- a/messages/en.json +++ b/messages/en.json @@ -5,6 +5,7 @@ "active_session": "Active Session", "block_height_numbered": "Block #{height}", "block_height_numbered_description": "Block #{height} was produced by {producer} on {timestamp}, which included {transactions} transactions performing {actions} actions.", + "buy_eos_with_coinbase": "Buy EOS with Coinbase", "common_about_something": "About {thing}", "common_action": "Action", "common_amount_exceeds_balance": "Amount exceeds available balance.", @@ -92,6 +93,7 @@ "contract_view_title": "Contract: {contract} | {network}", "delegation_metadata_refund_description": "Claim previously delegated {network} tokens.", "delegation_metadata_refund_title": "Refund Delegated {network} Tokens", + "details": "Details", "error_loading_accounts": "Error loading accounts: {error}", "form_validation_insufficient_balance": "Insufficient {unit} balance. Please enter a smaller amount.", "form_validation_invalid_number_decimals": "Invalid number, too many decimal places.", @@ -99,8 +101,12 @@ "key_page_subtitle": "The {accounts} account(s) associated with this public key", "key_page_title": "Public Key", "legacy_key": "Legacy Key", + "limits": "Limits", "loading_accounts": "Loading accounts...", + "must_be_logged_in_for_feature": "You must be logged in with an account to use this feature.", "no_accounts_found": "No accounts found", + "no_supported_funding_methods": "No supported funding methods for this blockchain.", + "processing_fees": "Processing fees", "ram_available_balance": "RAM Available", "ram_form_buy_amount": "Amount of RAM to buy:", "ram_metadata_buy_description": "Exchange {token} for RAM on the {network} network using an {network} compatible wallet.", @@ -114,6 +120,7 @@ "ram_to_purchase": "RAM to be bought", "ram_to_sell": "RAM to be sold", "search_view_type": "View {type}", + "select_provider": "Select provider", "send_amount_to_send": "Amount to send", "send_enter_amount": "Enter the amount of {token} to send", "send_memo_placeholder": "Specify a public memo for this transfer (optional)", diff --git a/src/routes/[network]/(account)/fund/+page.svelte b/src/routes/[network]/(account)/fund/+page.svelte index 5ae9daa2..95c38801 100644 --- a/src/routes/[network]/(account)/fund/+page.svelte +++ b/src/routes/[network]/(account)/fund/+page.svelte @@ -1,4 +1,5 @@ -

Onramps

-

- After logging in with your EOS account, EOS tokens can be purchased directly from the following - platforms and the tokens will immediately be sent to your on-chain account. -

+

{m.select_provider()}

+ {#if !context.account} -

You must be logged in with an account to use this feature.

-{:else if !coinbaseInstance} -

No supported funding methods for this blockchain.

+

+ {m.must_be_logged_in_for_feature()} +

{:else} - + + {#each ON_RAMP_SERVICES as service} + +
+
+ {service.id} +
+
+
+

{m.processing_fees()}

+

{service.fees.range}

+
+
+
+

{m.limits()}

+

{service.limits.daily}

+
+
+
+

{m.details()}

+
    + {#each service.details as detail} +
  • {detail}
  • + {/each} +
+
+
+ {#if service.id === 'coinbase' && coinbaseInstance} + + {:else} +

{m.no_supported_funding_methods()}

+ {/if} +
+
+ {/each} +
{/if} +

Exchanges

EOS can be purchased through a number of platforms, depending on the users needs and location. @@ -97,11 +162,9 @@ {#if context.settings.data.debugMode}

{m.common_debugging()}

- {JSON.stringify(options, null, 2)} - {JSON.stringify(coinbaseInstance, null, 2)} diff --git a/static/coinbase-icon.svg b/static/coinbase-icon.svg new file mode 100644 index 00000000..8f15c1a2 --- /dev/null +++ b/static/coinbase-icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + From a9ad016de3763d211be61422928ee0c6632bd82c Mon Sep 17 00:00:00 2001 From: dafuga Date: Wed, 18 Dec 2024 01:26:46 -0500 Subject: [PATCH 17/56] enhancement: polished the exchanges section --- messages/en.json | 20 +- .../[network]/(account)/fund/+page.svelte | 179 ++++++++++++------ static/binance.webp | Bin 0 -> 9376 bytes static/coinbase.webp | Bin 0 -> 4116 bytes static/gate-io.webp | Bin 0 -> 8814 bytes static/huobi.webp | Bin 0 -> 3824 bytes static/kraken.webp | Bin 0 -> 3462 bytes static/kucoin.webp | Bin 0 -> 6078 bytes static/okx.webp | Bin 0 -> 768 bytes static/upbit.webp | Bin 0 -> 5288 bytes 10 files changed, 128 insertions(+), 71 deletions(-) create mode 100644 static/binance.webp create mode 100644 static/coinbase.webp create mode 100644 static/gate-io.webp create mode 100644 static/huobi.webp create mode 100644 static/kraken.webp create mode 100644 static/kucoin.webp create mode 100644 static/okx.webp create mode 100644 static/upbit.webp diff --git a/messages/en.json b/messages/en.json index 8efb6637..35a52ddd 100644 --- a/messages/en.json +++ b/messages/en.json @@ -5,7 +5,6 @@ "active_session": "Active Session", "block_height_numbered": "Block #{height}", "block_height_numbered_description": "Block #{height} was produced by {producer} on {timestamp}, which included {transactions} transactions performing {actions} actions.", - "buy_eos_with_coinbase": "Buy EOS with Coinbase", "common_about_something": "About {thing}", "common_action": "Action", "common_amount_exceeds_balance": "Amount exceeds available balance.", @@ -93,7 +92,6 @@ "contract_view_title": "Contract: {contract} | {network}", "delegation_metadata_refund_description": "Claim previously delegated {network} tokens.", "delegation_metadata_refund_title": "Refund Delegated {network} Tokens", - "details": "Details", "error_loading_accounts": "Error loading accounts: {error}", "form_validation_insufficient_balance": "Insufficient {unit} balance. Please enter a smaller amount.", "form_validation_invalid_number_decimals": "Invalid number, too many decimal places.", @@ -101,12 +99,8 @@ "key_page_subtitle": "The {accounts} account(s) associated with this public key", "key_page_title": "Public Key", "legacy_key": "Legacy Key", - "limits": "Limits", "loading_accounts": "Loading accounts...", - "must_be_logged_in_for_feature": "You must be logged in with an account to use this feature.", "no_accounts_found": "No accounts found", - "no_supported_funding_methods": "No supported funding methods for this blockchain.", - "processing_fees": "Processing fees", "ram_available_balance": "RAM Available", "ram_form_buy_amount": "Amount of RAM to buy:", "ram_metadata_buy_description": "Exchange {token} for RAM on the {network} network using an {network} compatible wallet.", @@ -120,7 +114,6 @@ "ram_to_purchase": "RAM to be bought", "ram_to_sell": "RAM to be sold", "search_view_type": "View {type}", - "select_provider": "Select provider", "send_amount_to_send": "Amount to send", "send_enter_amount": "Enter the amount of {token} to send", "send_memo_placeholder": "Specify a public memo for this transfer (optional)", @@ -155,5 +148,16 @@ "staking_network_title": "{network} Network Staking", "staking_withdraw_timeframe": "Withdrawable in 21 days", "test_locale_string": "This is a test", - "total_proceeds": "Total Proceeds" + "total_proceeds": "Total Proceeds", + "select_provider": "Select provider", + "must_be_logged_in_for_feature": "You must be logged in with an account to use this feature.", + "processing_fees": "Processing fees", + "limits": "Limits", + "details": "Details", + "buy_eos_with_coinbase": "Buy EOS with Coinbase", + "no_supported_funding_methods": "No supported funding methods for this blockchain.", + "tokens_purchase_providers": "Tokens can be purchased directly through the following providers:", + "coinbase_service_unavailable": "Coinbase service is currently unavailable.", + "where_eos_can_be_purchased": "EOS can be purchased through a number of platforms, depending on the users needs and location.\n\tBelow are some of the most popular options available.", + "exchanges": "Exchanges:" } diff --git a/src/routes/[network]/(account)/fund/+page.svelte b/src/routes/[network]/(account)/fund/+page.svelte index 95c38801..18aeeed2 100644 --- a/src/routes/[network]/(account)/fund/+page.svelte +++ b/src/routes/[network]/(account)/fund/+page.svelte @@ -8,9 +8,8 @@ import { env } from '$env/dynamic/public'; import * as m from '$lib/paraglide/messages'; import { MultiCard } from '$lib/components/layout'; - import Center from '$lib/components/layout/center.svelte'; - const ON_RAMP_SERVICES = [ + const ON_RAMP_PROVIDERS = [ { id: 'coinbase', logo: '/coinbase-icon.svg', @@ -29,6 +28,49 @@ } ] as const; + const EXCHANGES = [ + { + name: 'Binance', + logo: '/binance.webp', + url: 'https://www.binance.com' + }, + { + name: 'Coinbase', + logo: '/coinbase.webp', + url: 'https://www.coinbase.com' + }, + { + name: 'Kraken', + logo: '/kraken.webp', + url: 'https://www.kraken.com' + }, + { + name: 'OKX', + logo: '/okx.webp', + url: 'https://www.okx.com' + }, + { + name: 'Huobi Global', + logo: '/huobi.webp', + url: 'https://global-aws.huobi.com' + }, + { + name: 'Gate.io', + logo: '/gate-io.webp', + url: 'https://www.gate.io' + }, + { + name: 'Upbit', + logo: '/upbit.webp', + url: 'https://upbit.com' + }, + { + name: 'Kucoin', + logo: '/kucoin.webp', + url: 'https://kucoin.com' + } + ] as const; + const context = getContext('state'); const coinbaseOptions: InitOnRampParams | undefined = $derived.by(() => { @@ -83,10 +125,16 @@ function handleCoinbaseOnRamp() { if (coinbaseInstance) { coinbaseInstance.open(); + } else { + console.error('Coinbase instance not found'); + alert(m.coinbase_service_unavailable()); } } - function handleOnRamp(service: (typeof ON_RAMP_SERVICES)[number]['id']) { + function handleOnRamp(service: (typeof ON_RAMP_PROVIDERS)[number]['id']) { + if (!context.account) { + return; + } if (service === 'coinbase') { return handleCoinbaseOnRamp(); } @@ -94,76 +142,81 @@ } -

{m.select_provider()}

+

Token Purchase Providers:

-{#if !context.account} -

- {m.must_be_logged_in_for_feature()} -

-{:else} - - {#each ON_RAMP_SERVICES as service} - -
-
- {service.id} + + {#each ON_RAMP_PROVIDERS as service} + +
+
+ {service.id} +
+
+
+

{m.processing_fees()}

+

{service.fees.range}

-
-
-

{m.processing_fees()}

-

{service.fees.range}

-
-
-
-

{m.limits()}

-

{service.limits.daily}

-
-
+
+
+

{m.limits()}

+

{service.limits.daily}

-

{m.details()}

-
    - {#each service.details as detail} -
  • {detail}
  • - {/each} -
-
-
- {#if service.id === 'coinbase' && coinbaseInstance} - - {:else} -

{m.no_supported_funding_methods()}

- {/if} +
- - {/each} - -{/if} +

{m.details()}

+
    + {#each service.details as detail} +
  • {detail}
  • + {/each} +
+
+
+ {#if !context.account} +

{m.must_be_logged_in_for_feature()}

+ {:else} + + {/if} +
+ + {/each} + + +

{m.exchanges()}

- -

Exchanges

-

- EOS can be purchased through a number of platforms, depending on the users needs and location. - Below are some of the most popular options available. +

+ {m.where_eos_can_be_purchased()}

- + + + {#each EXCHANGES as exchange} + + +
+ {exchange.name} logo +
+

{exchange.name}

+
+
+ {/each} +
{#if context.settings.data.debugMode}

{m.common_debugging()}

- {JSON.stringify(options, null, 2)} + {JSON.stringify(coinbaseOptions, null, 2)} {JSON.stringify(coinbaseInstance, null, 2)} diff --git a/static/binance.webp b/static/binance.webp new file mode 100644 index 0000000000000000000000000000000000000000..050aec760e92365d6e47076f58ccbc8a646a3a4b GIT binary patch literal 9376 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 O$5O|o#Wwly-v0nQ&s~84 literal 0 HcmV?d00001 diff --git a/static/coinbase.webp b/static/coinbase.webp new file mode 100644 index 0000000000000000000000000000000000000000..2a732019b4b169c9e6d70754fd317d6debcd79de GIT binary patch literal 4116 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 LsXhLC{Q>_2jes19 literal 0 HcmV?d00001 diff --git a/static/gate-io.webp b/static/gate-io.webp new file mode 100644 index 0000000000000000000000000000000000000000..cb53091e125e88c1120d37dd686777513bf8ecf7 GIT binary patch literal 8814 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 literal 0 HcmV?d00001 diff --git a/static/huobi.webp b/static/huobi.webp new file mode 100644 index 0000000000000000000000000000000000000000..10ff703f07fccb4acd1e2d0a676d4387e94bc5c7 GIT binary patch literal 3824 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 U2y#4DrDT+T#yj`t^Z&R05ALK=WdHyG literal 0 HcmV?d00001 diff --git a/static/kraken.webp b/static/kraken.webp new file mode 100644 index 0000000000000000000000000000000000000000..ad981c6727de32e128cf3f82d50cc2edb8942a07 GIT binary patch literal 3462 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

Xj|Ca#u^irYUH0h(EINRpH<0>pz^@k~4>! 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 E08AJ21poj5 literal 0 HcmV?d00001 diff --git a/static/okx.webp b/static/okx.webp new file mode 100644 index 0000000000000000000000000000000000000000..46a23e7278dd8052f4e08b1576b4d0e602ec40fc GIT binary patch literal 768 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 HFV24e2z+)L literal 0 HcmV?d00001 From 0d3446ad6bd566a887ed0e7cd3801b812d0efe8c Mon Sep 17 00:00:00 2001 From: dafuga Date: Wed, 18 Dec 2024 01:54:56 -0500 Subject: [PATCH 18/56] chore: localizing page metadata --- messages/en.json | 24 +++++++++++--------- src/routes/[network]/(account)/fund/+page.ts | 9 ++++---- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/messages/en.json b/messages/en.json index 35a52ddd..c7acd936 100644 --- a/messages/en.json +++ b/messages/en.json @@ -5,6 +5,8 @@ "active_session": "Active Session", "block_height_numbered": "Block #{height}", "block_height_numbered_description": "Block #{height} was produced by {producer} on {timestamp}, which included {transactions} transactions performing {actions} actions.", + "buy_eos_with_coinbase": "Buy EOS with Coinbase", + "coinbase_service_unavailable": "Coinbase service is currently unavailable.", "common_about_something": "About {thing}", "common_action": "Action", "common_amount_exceeds_balance": "Amount exceeds available balance.", @@ -92,15 +94,23 @@ "contract_view_title": "Contract: {contract} | {network}", "delegation_metadata_refund_description": "Claim previously delegated {network} tokens.", "delegation_metadata_refund_title": "Refund Delegated {network} Tokens", + "details": "Details", "error_loading_accounts": "Error loading accounts: {error}", + "exchanges": "Exchanges:", "form_validation_insufficient_balance": "Insufficient {unit} balance. Please enter a smaller amount.", "form_validation_invalid_number_decimals": "Invalid number, too many decimal places.", + "fund_account": "Fund Account", + "fund_account_description": "Purchase EOS tokens to fund your account", "key_page_description": "A public key associated with {accounts} account(s) on the {network} network.", "key_page_subtitle": "The {accounts} account(s) associated with this public key", "key_page_title": "Public Key", "legacy_key": "Legacy Key", + "limits": "Limits", "loading_accounts": "Loading accounts...", + "must_be_logged_in_for_feature": "You must be logged in with an account to use this feature.", "no_accounts_found": "No accounts found", + "no_supported_funding_methods": "No supported funding methods for this blockchain.", + "processing_fees": "Processing fees", "ram_available_balance": "RAM Available", "ram_form_buy_amount": "Amount of RAM to buy:", "ram_metadata_buy_description": "Exchange {token} for RAM on the {network} network using an {network} compatible wallet.", @@ -114,6 +124,7 @@ "ram_to_purchase": "RAM to be bought", "ram_to_sell": "RAM to be sold", "search_view_type": "View {type}", + "select_provider": "Select provider", "send_amount_to_send": "Amount to send", "send_enter_amount": "Enter the amount of {token} to send", "send_memo_placeholder": "Specify a public memo for this transfer (optional)", @@ -148,16 +159,7 @@ "staking_network_title": "{network} Network Staking", "staking_withdraw_timeframe": "Withdrawable in 21 days", "test_locale_string": "This is a test", - "total_proceeds": "Total Proceeds", - "select_provider": "Select provider", - "must_be_logged_in_for_feature": "You must be logged in with an account to use this feature.", - "processing_fees": "Processing fees", - "limits": "Limits", - "details": "Details", - "buy_eos_with_coinbase": "Buy EOS with Coinbase", - "no_supported_funding_methods": "No supported funding methods for this blockchain.", "tokens_purchase_providers": "Tokens can be purchased directly through the following providers:", - "coinbase_service_unavailable": "Coinbase service is currently unavailable.", - "where_eos_can_be_purchased": "EOS can be purchased through a number of platforms, depending on the users needs and location.\n\tBelow are some of the most popular options available.", - "exchanges": "Exchanges:" + "total_proceeds": "Total Proceeds", + "where_eos_can_be_purchased": "EOS can be purchased through a number of platforms, depending on the users needs and location.\n\tBelow are some of the most popular options available." } diff --git a/src/routes/[network]/(account)/fund/+page.ts b/src/routes/[network]/(account)/fund/+page.ts index 1b17aa8c..55c320fe 100644 --- a/src/routes/[network]/(account)/fund/+page.ts +++ b/src/routes/[network]/(account)/fund/+page.ts @@ -1,12 +1,13 @@ import type { PageLoad } from './$types'; +import * as m from '$lib/paraglide/messages'; export const load: PageLoad = async () => { return { - title: 'Fund Account', - subtitle: 'Purchase EOS tokens to fund your account', + title: m.fund_account(), + subtitle: m.fund_account_description(), pageMetaTags: { - title: 'Fund Account', - description: 'Purchase EOS tokens to fund your account' + title: m.fund_account(), + description: m.fund_account_description() } }; }; From 19e0de060b2e79b7c9756c48e55f6b5751790f8c Mon Sep 17 00:00:00 2001 From: dafuga Date: Wed, 18 Dec 2024 02:08:39 -0500 Subject: [PATCH 19/56] fix: making the on ramp provider card look more presentable on bigger screens --- src/routes/[network]/(account)/fund/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/[network]/(account)/fund/+page.svelte b/src/routes/[network]/(account)/fund/+page.svelte index 18aeeed2..ecbe7e55 100644 --- a/src/routes/[network]/(account)/fund/+page.svelte +++ b/src/routes/[network]/(account)/fund/+page.svelte @@ -144,7 +144,7 @@

Token Purchase Providers:

- + {#each ON_RAMP_PROVIDERS as service}
From 08df100767826efa4f3ca7c3bda10c2de00d94ba Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Wed, 18 Dec 2024 05:22:50 -0800 Subject: [PATCH 20/56] style: update homepage buttons --- .../(homepage)/components/carousel.svelte | 20 ++++++++++--------- .../components/homepage-button.svelte | 7 ++++++- .../components/staking-rewards.svelte | 8 ++++++-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/routes/[network]/(homepage)/components/carousel.svelte b/src/routes/[network]/(homepage)/components/carousel.svelte index 0f7a9609..bdc1bd00 100644 --- a/src/routes/[network]/(homepage)/components/carousel.svelte +++ b/src/routes/[network]/(homepage)/components/carousel.svelte @@ -4,6 +4,7 @@ import { getContext } from 'svelte'; import type { UnicoveContext } from '$lib/state/client.svelte'; import TextBlock from './text-block.svelte'; + import HomepageButton from './homepage-button.svelte'; const { network } = getContext('state'); @@ -60,15 +61,16 @@ + title="The EOS Wallet for MetaMask" + text={`MetaMask, an the industry leading self-custody wallet, is now compatible with Unicove and the ${networkName} network. Install the ${networkName} Wallet snap for MetaMask to get started.`} + > + +
diff --git a/src/routes/[network]/(homepage)/components/homepage-button.svelte b/src/routes/[network]/(homepage)/components/homepage-button.svelte index 70939fa2..b99b0602 100644 --- a/src/routes/[network]/(homepage)/components/homepage-button.svelte +++ b/src/routes/[network]/(homepage)/components/homepage-button.svelte @@ -1,17 +1,22 @@ - {/if} - {@render props.children?.()} - -{/snippet} - @@ -58,119 +42,8 @@ - -
- -
- {#if tokenPrices.length} - - {/if} -
-
- {#if ramPrices.length} - - {/if} -
-
- -
- {@render textblock({ - title: `EOS: The Native Token`, - text: `The ${data.network.chain.name} network's native token, EOS, can be used for staking rewards, to buy and sell RAM, to pay transaction fees, and more. It is traded on most major exchanges.`, - button: { - text: 'Get Tokens', - href: `${data.network}/fund` - } - })} -
-
- {@render textblock({ - title: `RAM: Tokenized Blockchain Storage`, - text: `Each unit of RAM ownership represents a portion of the network's total blockchain storage. RAM can be bought and sold directly from the network using the RAM Market.`, - button: { - text: 'EOS/RAM Market', - href: `${data.network}/ram` - } - })} -
-
-
+ -
- -
- {@render textblock({ - title: `EOS Network DeFi`, - text: 'System-level DeFi is offered by the EOS network both staking and RAM trading. The network also supports a variety of DeFi applications, including decentralized exchanges, lending platforms, swaps, and more.' - // button: { - // text: 'Explore DeFi Platforms', - // href: `${data.network}/defi` - // } - })} -
- - -
- -
-

- {data.network.chain.systemToken?.symbol.name}/{data.network.tokenprice?.symbol.name} -

-

- -

-
-
- -
-

Native TVL

-

- -

-
-
- - {networkName} - - -
-

RAM/EOS

-

- -

-
-
- -
-

???

-
-
- -
-

EOS Market Cap

-

- -

-
-
- -
-

RAM/USD

-

- -

-
-
-
-
+
diff --git a/src/routes/[network]/(homepage)/components/charts.svelte b/src/routes/[network]/(homepage)/components/charts.svelte new file mode 100644 index 00000000..4e53831e --- /dev/null +++ b/src/routes/[network]/(homepage)/components/charts.svelte @@ -0,0 +1,56 @@ + + +
+ + {#if tokenPrices.length} + + {/if} + + + + + + + + {#if ramPrices.length} + + {/if} + + + + + +
diff --git a/src/routes/[network]/(homepage)/components/performance-grid.svelte b/src/routes/[network]/(homepage)/components/performance-grid.svelte new file mode 100644 index 00000000..bbf71ff8 --- /dev/null +++ b/src/routes/[network]/(homepage)/components/performance-grid.svelte @@ -0,0 +1,110 @@ + + +
+ +
+ + + +
+ + +
+ +
+

+ {network.chain.systemToken?.symbol.name}/{network.tokenprice?.symbol.name} +

+

+ +

+
+
+ +
+

Native TVL

+

+ +

+
+
+ + {networkName} + + +
+

RAM/EOS

+

+ +

+
+
+ +
+

???

+
+
+ +
+

EOS Market Cap

+

+ +

+
+
+ +
+

RAM/USD

+

+ +

+
+
+
+
From 3208760df959903fadda55a4a605351e4522ab77 Mon Sep 17 00:00:00 2001 From: Dean Sallinen <7519573+deansallinen@users.noreply.github.com> Date: Wed, 18 Dec 2024 06:29:57 -0800 Subject: [PATCH 22/56] fix: chart responsiveness --- .../components/chart/chart-container.svelte | 55 +++++++++++++++++++ .../components/chart/eospricehistory.svelte | 39 +++++-------- .../components/chart/rampricehistory.svelte | 36 +++++------- src/routes/[network]/(homepage)/+page.svelte | 26 +-------- .../(homepage)/components/charts.svelte | 9 ++- .../components/staking-rewards.svelte | 9 +-- 6 files changed, 94 insertions(+), 80 deletions(-) create mode 100644 src/lib/components/chart/chart-container.svelte diff --git a/src/lib/components/chart/chart-container.svelte b/src/lib/components/chart/chart-container.svelte new file mode 100644 index 00000000..5b5cbdd4 --- /dev/null +++ b/src/lib/components/chart/chart-container.svelte @@ -0,0 +1,55 @@ + + + +
+
+

{pair}

+

{currentPrice}

+

{percentChange}

+
+ -
+ -
-
- {data[data.length - 1].date.toLocaleDateString()} -
-
-
- EOS/USD -
-
- Today -
-
+ diff --git a/src/lib/components/chart/rampricehistory.svelte b/src/lib/components/chart/rampricehistory.svelte index ce32411c..68bf15db 100644 --- a/src/lib/components/chart/rampricehistory.svelte +++ b/src/lib/components/chart/rampricehistory.svelte @@ -3,10 +3,9 @@ import dayjs from 'dayjs'; import { Chart } from 'chart.js'; import 'chart.js/auto'; - import { Card } from '$lib/components/layout'; import { Asset } from '@wharfkit/antelope'; - import Select from '../select/select.svelte'; import type { ExtendedSelectOption } from '../select/types'; + import ChartContainer from './chart-container.svelte'; interface Props { data: { date: Date; value: Asset }[]; @@ -78,6 +77,7 @@ options: { normalized: true, responsive: true, + maintainAspectRatio: false, interaction: { mode: 'x', intersect: false @@ -118,27 +118,17 @@ chart.data.datasets[0].data = values; chart.update(); }); + + let startDate = $derived(dataRange[dataRange.length - 1].date.toLocaleDateString()); - -
-
-

EOS/RAM

-

{currentPrice}

-

{percentChange}

-
-