From 08695ab870ae188531b532f77b31c9caf847f5de Mon Sep 17 00:00:00 2001 From: Viterbo Date: Mon, 16 Dec 2024 14:56:02 -0300 Subject: [PATCH 01/13] abstract JSON config for networks --- src/config/chains/telos-evm-testnet/index.ts | 448 +++++++-------- src/config/chains/telos-evm/index.ts | 542 ++++++++++--------- src/core/types/NetworkConfig.ts | 152 ++++++ src/core/types/index.ts | 1 + 4 files changed, 666 insertions(+), 477 deletions(-) create mode 100644 src/core/types/NetworkConfig.ts diff --git a/src/config/chains/telos-evm-testnet/index.ts b/src/config/chains/telos-evm-testnet/index.ts index cf9ff30e..78978439 100644 --- a/src/config/chains/telos-evm-testnet/index.ts +++ b/src/config/chains/telos-evm-testnet/index.ts @@ -1,79 +1,216 @@ import EVMChainSettings from 'src/core/chains/EVMChainSettings'; import { RpcEndpoint } from 'universal-authenticator-library'; -import { FooterLinksConfig, HeaderMenuConfig, NativeCurrencyAddress, PriceChartData, SocialLink, Themes, addressString } from 'src/core/types'; +import { FooterLinksConfig, HeaderMenuConfig, NativeCurrencyAddress, NetworkConfig, PriceChartData, SocialLink, Themes, addressString } from 'src/core/types'; import { TokenClass, TokenSourceInfo } from 'src/core/types'; import { useUserStore } from 'src/core'; import { getFiatPriceFromIndexer, getCoingeckoPriceChartData, getCoingeckoUsdPrice } from 'src/lib/price'; +declare const fathom: { trackEvent: (eventName: string) => void }; + // specific for Telos import { TelosEvmApi } from '@telosnetwork/telosevm-js'; -const LOGO = 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png'; -const CHAIN_ID = '41'; -export const NETWORK = 'telos-evm-testnet'; -const DISPLAY = 'Telos EVM (Testnet)'; -const TOKEN = new TokenClass({ - name: 'Telos', - symbol: 'TLOS', - network: NETWORK, - decimals: 18, - address: NativeCurrencyAddress, - logo: LOGO, - logoURI: LOGO, - isNative: false, - isSystem: true, -} as TokenSourceInfo); - -const S_TOKEN = new TokenClass({ - name: 'Staked Telos', - symbol: 'STLOS', - network: NETWORK, - decimals: 18, - address: '0xa9991E4daA44922D00a78B6D986cDf628d46C4DD', - logo: 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/stlos.png', - isNative: false, - isSystem: false, -} as TokenSourceInfo); - -const W_TOKEN = new TokenClass({ - name: 'Wrapped Telos', - symbol: 'WTLOS', - network: NETWORK, - decimals: 18, - address: '0xaE85Bf723A9e74d6c663dd226996AC1b8d075AA9', - logo: 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/wtlos.png', - isNative: false, - isSystem: false, -} as TokenSourceInfo); - -const RPC_ENDPOINT = { - protocol: 'https', - host: 'testnet.telos.net', - port: 443, - path: '/evm', -}; -const ESCROW_CONTRACT_ADDRESS = '0x7E9cF9fBc881652B05BB8F26298fFAB538163b6f'; -const API_ENDPOINT = 'https://api-dev.telos.net/v1'; -const WEI_PRECISION = 18; -const EXPLORER_URL = 'https://testnet.teloscan.io'; -const ECOSYSTEM_URL = 'https://www.telos.net/ecosystem'; -const BRIDGE_URL = 'https://telos-bridge-testnet.netlify.app/bridge'; - -const NETWORK_EVM_ENDPOINT = 'https://testnet.telos.net'; -const INDEXER_ENDPOINT = 'https://api.testnet.teloscan.io'; -const CONTRACTS_BUCKET = 'https://verified-evm-contracts-testnet.s3.amazonaws.com'; - -declare const fathom: { trackEvent: (eventName: string) => void }; +const config: NetworkConfig = +{ + 'network': 'telos-evm-testnet', + 'display': 'Telos EVM (Testnet)', + 'chainId': '41', + 'isTestnet': true, + 'logos': { + 'large': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png', + 'small': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png', + }, + 'systemTokens': [ + { + 'name': 'Telos', + 'symbol': 'TLOS', + 'network': 'telos-evm-testnet', + 'decimals': 18, + 'address': NativeCurrencyAddress, + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png', + 'isNative': false, + 'isSystem': true, + }, + { + 'name': 'Staked Telos', + 'symbol': 'STLOS', + 'network': 'telos-evm-testnet', + 'decimals': 18, + 'address': '0xa9991E4daA44922D00a78B6D986cDf628d46C4DD', + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/stlos.png', + 'isNative': false, + 'isSystem': false, + }, + { + 'name': 'Wrapped Telos', + 'symbol': 'WTLOS', + 'network': 'telos-evm-testnet', + 'decimals': 18, + 'address': '0xaE85Bf723A9e74d6c663dd226996AC1b8d075AA9', + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/wtlos.png', + 'isNative': false, + 'isSystem': false, + }, + ], + 'escrowContractAddress': '0x7E9cF9fBc881652B05BB8F26298fFAB538163b6f', + 'apiEndpoints': { + 'rpc': { + 'protocol': 'https', + 'host': 'testnet.telos.net', + 'port': 443, + 'path': '/evm', + }, + 'api': 'https://api-dev.telos.net/v1', + 'hyperion': 'https://testnet.telos.net', + 'explorer': 'https://testnet.teloscan.io', + 'ecosystem': 'https://www.telos.net/ecosystem', + 'bridge': 'https://telos-bridge-testnet.netlify.app/bridge', + 'indexer': 'https://api.testnet.telosscan.io', + 'contractsBucket': 'https://verified-evm-contracts-testnet.s3.amazonaws.com', + 'monitor': 'https://api.monitor-test.telos.net', + }, + 'priceData': { + 'coingeckoId': 'telos', + }, + 'weiPrecision': 18, + 'themes': { + 'light': { + 'primary': '#0099ff', + 'secondary': '#fa9900', + 'accent': '#AA00EE', + 'dark': '#1d1d1d', + 'positive': '#008800', + 'negative': '#880000', + 'info': '#31CCEC', + 'warning': '#F2C037', + 'notify-success': '#009900', + 'notify-error': '#990000', + 'notify-neutral': '#4D4D4D', + 'notify-info': '#006699', + }, + 'dark': { + 'primary': '#00AA77', + 'secondary': '#ffff00', + 'accent': '#ff00ff', + 'dark': '#1d1d1d', + 'positive': '#008800', + 'negative': '#880000', + 'info': '#31CCEC', + 'warning': '#F2C037', + 'notify-success': '#00FF00', + 'notify-error': '#FF0000', + 'notify-neutral': '#858585', + 'notify-info': '#0099FF', + }, + }, + 'socialLinks': [ + { + 'name': 'X (Twitter)', + 'url': 'https://twitter.com/HelloTelos', + 'icon': 'twitter', + 'classSuffix': 'x-twitter', + }, + ], + 'footerLinks': { + 'chain': 'telos-evm-testnet', + 'branding': { + 'title': 'Telos Testnet', + 'logoLight': '/assets/telos-testnet-logo.png', + 'logoDark': '/assets/telos-testnet-logo--dark.png', + 'url': 'https://testnet.telos.net/', + }, + 'columns': [ + { + 'title': 'components.footer.telos', + 'links': [ + { 'label': 'components.footer.telos_homepage', 'url': 'https://testnet.telos.net/' }, + { 'label': 'components.footer.telos_wallet', 'url': 'https://wallet-dev.telos.net/' }, + { 'label': 'components.footer.telos_bridge', 'url': 'https://telos-bridge-testnet.netlify.app/bridge' }, + ], + }, + { + 'title': 'components.footer.about', + 'links': [ + { 'label': 'components.footer.about_us', 'url': 'https://www.telos.net/about' }, + { 'label': 'components.footer.contactUs', 'url': 'http://t.me/HelloTelos' }, + ], + }, + ], + }, + 'headerMenuConfig': { + 'chain': 'telos-evm-testnet', + 'entries': [ + { + 'label': 'components.header.home', + 'internalLink': 'home', + }, + { + 'label': 'components.header.blockchain', + 'entries': [ + { + 'label': 'components.header.internal_transactions', + 'internalLink': 'txsinternal', + }, + { + 'label': 'components.header.transactions', + 'internalLink': 'transactions', + }, + { + 'label': 'components.header.blocks', + 'internalLink': 'blocks', + }, + ], + }, + { + 'label': 'components.header.telos_wallet', + 'externalLink': 'https://wallet-dev.telos.net/', + }, + { + 'label': 'components.header.telos_bridge', + 'externalLink': 'https://telos-bridge-testnet.netlify.app/bridge', + }, + { + 'label': 'components.header.more', + 'entries': [ + { + 'label': 'global.language', + 'trigger': 'language', + 'leftIcon': 'fas fa-language', + }, + { + 'label': 'components.header.csv_export', + 'internalLink': 'export', + }, + { + 'label': 'components.header.health_monitor', + 'internalLink': 'health', + }, + ], + }, + ], + }, + 'buyMoreTokenLink': 'https://app.telos.net/testnet/evm-faucet', + 'nativeUalChain': { + 'chainId': '1eaa0824707c8c16bd25145493bf062aecddfeb56c736f6ba6397f3195f33c9f', + 'rpcEndpoints': [ + { + 'protocol': 'https', + 'host': 'testnet.telos.net', + 'port': 443, + }, + ], + }, +} +; -// UAL chain -const NETWORK_CHAIN_ID = '1eaa0824707c8c16bd25145493bf062aecddfeb56c736f6ba6397f3195f33c9f'; -const NETWORK_PROTOCOL = 'https'; -const NETWORK_PORT = 443; -const NETWORK_HOST = 'testnet.telos.net'; +console.log('telos-evm-testnet:', config); -export default class TelosEVMTestnet extends EVMChainSettings { +export default class TelosEVM extends EVMChainSettings { nativeSupport: TelosEvmApi; + _systemToken: TokenClass = new TokenClass(config.systemTokens[0] as TokenSourceInfo); + _stakedSystemToken: TokenClass = new TokenClass(config.systemTokens[1] as TokenSourceInfo); + _wrappedSystemToken: TokenClass = new TokenClass(config.systemTokens[2] as TokenSourceInfo); constructor(network: string) { super(network); this.nativeSupport = new TelosEvmApi({ @@ -84,35 +221,30 @@ export default class TelosEVMTestnet extends EVMChainSettings { telosPrivateKeys: [], fetch, }); - console.assert(network === NETWORK, `Network name mismatch: '${network}' !== '${NETWORK}'`); - } - - isTestnet() { - return true; } getNetwork(): string { - return NETWORK; + return config.network; } getChainId(): string { - return CHAIN_ID; + return config.chainId; } getDisplay(): string { - return DISPLAY; + return config.display; } getHyperionEndpoint(): string { - return NETWORK_EVM_ENDPOINT; + return config.apiEndpoints.hyperion; } getRPCEndpoint(): RpcEndpoint { - return RPC_ENDPOINT; + return config.apiEndpoints.rpc; } getApiEndpoint(): string { - return API_ENDPOINT; + return config.apiEndpoints.api; } getPriceData(): Promise { @@ -120,19 +252,19 @@ export default class TelosEVMTestnet extends EVMChainSettings { } getSystemToken(): TokenClass { - return TOKEN; + return this._systemToken; } getStakedSystemToken(): TokenClass { - return S_TOKEN; + return this._stakedSystemToken; } getWrappedSystemToken(): TokenClass { - return W_TOKEN; + return this._wrappedSystemToken; } getEscrowContractAddress(): addressString { - return ESCROW_CONTRACT_ADDRESS; + return config.escrowContractAddress as addressString; } async getUsdPrice(): Promise { @@ -150,175 +282,67 @@ export default class TelosEVMTestnet extends EVMChainSettings { } getLargeLogoPath(): string { - return LOGO; + return config.logos.large; } getSmallLogoPath(): string { - return LOGO; + return config.logos.small; } getWeiPrecision(): number { - return WEI_PRECISION; + return config.weiPrecision; } getExplorerUrl(): string { - return EXPLORER_URL; + return config.apiEndpoints.explorer; } getEcosystemUrl(): string { - return ECOSYSTEM_URL; + return config.apiEndpoints.ecosystem; } getThemes(): Themes { - return { - light: { - primary: '#0099ff', - secondary: '#fa9900', - accent: '#AA00EE', - dark: '#1d1d1d', - positive: '#008800', - negative: '#880000', - info: '#31CCEC', - warning: '#F2C037', - 'notify-success': '#009900', - 'notify-error': '#990000', - 'notify-neutral': '#4D4D4D', - 'notify-info': '#006699', - }, - dark: { - primary: '#00AA77', - secondary: '#ffff00', - accent: '#ff00ff', - dark: '#1d1d1d', - positive: '#008800', - negative: '#880000', - info: '#31CCEC', - warning: '#F2C037', - 'notify-success': '#00FF00', - 'notify-error': '#FF0000', - 'notify-neutral': '#858585', - 'notify-info': '#0099FF', - }, - }; + return config.themes; } getSocialLinks(): SocialLink[] { - return [ - { - name: 'X (Twitter)', - url: 'https://twitter.com/HelloTelos', - icon: 'twitter', - classSuffix: 'x-twitter', - }, - ]; + return config.socialLinks; } getFooterLinks(): FooterLinksConfig { - return { - chain: 'telos-evm-testnet', - branding: { - title: 'Telos Testnet', - logoLight: '/assets/telos-testnet-logo.png', - logoDark: '/assets/telos-testnet-logo--dark.png', - url: 'https://testnet.telos.net/', - }, - columns: [ - { - title: 'components.footer.telos', - links: [ - { label: 'components.footer.telos_homepage', url: 'https://testnet.telos.net/' }, - { label: 'components.footer.telos_wallet', url: 'https://wallet-dev.telos.net/' }, - { label: 'components.footer.telos_bridge', url: 'https://telos-bridge-testnet.netlify.app/bridge' }, - ], - }, - { - title: 'components.footer.about', - links: [ - { label: 'components.footer.about_us', url: 'https://www.telos.net/about' }, - { label: 'components.footer.contactUs', url: 'http://t.me/HelloTelos' }, - ], - }, - ], - }; + return config.footerLinks; } getHeaderMenuConfig(): HeaderMenuConfig { - return { - chain: 'telos-evm-testnet', - entries: [ - { - label: 'components.header.home', - internalLink: 'home', - }, - { - label: 'components.header.blockchain', - entries: [ - { - label: 'components.header.internal_transactions', - internalLink: 'txsinternal', - }, - { - label: 'components.header.transactions', - internalLink: 'transactions', - }, - { - label: 'components.header.blocks', - internalLink: 'blocks', - }, - ], - }, - { - label: 'components.header.telos_wallet', - externalLink: 'https://wallet-dev.telos.net/', - }, - { - label: 'components.header.telos_bridge', - externalLink: 'https://telos-bridge-testnet.netlify.app/bridge', - }, - { - label: 'components.header.more', - entries: [ - { - label: 'global.language', - trigger: 'language', - leftIcon: 'fas fa-language', - }, - { - label: 'components.header.csv_export', - internalLink: 'export', - }, - { - label: 'components.header.health_monitor', - internalLink: 'health', - }, - ], - }, - ], - }; + return config.headerMenuConfig; } getBridgeUrl(): string { - return BRIDGE_URL; + return config.apiEndpoints.bridge; } getTrustedContractsBucket(): string { - return CONTRACTS_BUCKET; + return config.apiEndpoints.contractsBucket; } getBuyMoreOfTokenLink(): string { - return 'https://app.telos.net/testnet/evm-faucet'; + return config.buyMoreTokenLink; } getSystemTokens(): TokenClass[] { - return [TOKEN, S_TOKEN, W_TOKEN]; + return [ + this.getSystemToken(), + this.getStakedSystemToken(), + this.getWrappedSystemToken(), + ]; } getIndexerApiEndpoint(): string { - return INDEXER_ENDPOINT; + return config.apiEndpoints.indexer as string; } hasIndexerSupport(): boolean { - return true; + return config.apiEndpoints.indexer !== undefined; } trackAnalyticsEvent(eventName: string): void { @@ -336,16 +360,7 @@ export default class TelosEVMTestnet extends EVMChainSettings { } getNativeUALChain() { - return { - chainId: NETWORK_CHAIN_ID, - rpcEndpoints: [ - { - protocol: NETWORK_PROTOCOL, - host: NETWORK_HOST, - port: NETWORK_PORT, - }, - ], - }; + return config.nativeUalChain; } async getEthAccountByNativeAccount(native: string): Promise { @@ -358,6 +373,7 @@ export default class TelosEVMTestnet extends EVMChainSettings { } getMonitorUrl(): string { - return 'https://api.monitor-test.telos.net'; + return config.apiEndpoints.monitor as string; } + } diff --git a/src/config/chains/telos-evm/index.ts b/src/config/chains/telos-evm/index.ts index e609e19d..e9a3ba88 100644 --- a/src/config/chains/telos-evm/index.ts +++ b/src/config/chains/telos-evm/index.ts @@ -1,77 +1,268 @@ import EVMChainSettings from 'src/core/chains/EVMChainSettings'; import { RpcEndpoint } from 'universal-authenticator-library'; -import { FooterLinksConfig, HeaderMenuConfig, NativeCurrencyAddress, PriceChartData, SocialLink, Themes, addressString } from 'src/core/types'; +import { FooterLinksConfig, HeaderMenuConfig, NativeCurrencyAddress, NetworkConfig, PriceChartData, SocialLink, Themes, addressString } from 'src/core/types'; import { TokenClass, TokenSourceInfo } from 'src/core/types'; import { useUserStore } from 'src/core'; import { getFiatPriceFromIndexer, getCoingeckoPriceChartData, getCoingeckoUsdPrice } from 'src/lib/price'; +declare const fathom: { trackEvent: (eventName: string) => void }; + // specific for Telos import { TelosEvmApi } from '@telosnetwork/telosevm-js'; -const LOGO = 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png'; -const CHAIN_ID = '40'; -export const NETWORK = 'telos-evm'; -const DISPLAY = 'Telos EVM'; -const TOKEN = new TokenClass({ - name: 'Telos', - symbol: 'TLOS', - network: NETWORK, - decimals: 18, - address: NativeCurrencyAddress, - logo: LOGO, - logoURI: LOGO, - isNative: false, - isSystem: true, -} as TokenSourceInfo); - -const S_TOKEN = new TokenClass({ - name: 'Staked Telos', - symbol: 'STLOS', - network: NETWORK, - decimals: 18, - address: '0xB4B01216a5Bc8F1C8A33CD990A1239030E60C905', - logo: 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/stlos.png', - isNative: false, - isSystem: false, -} as TokenSourceInfo); - -const W_TOKEN = new TokenClass({ - name: 'Wrapped Telos', - symbol: 'WTLOS', - network: NETWORK, - decimals: 18, - address: '0xD102cE6A4dB07D247fcc28F366A623Df0938CA9E', - logo: 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/wtlos.png', - isNative: false, - isSystem: false, -} as TokenSourceInfo); - -const RPC_ENDPOINT = { - protocol: 'https', - host: 'mainnet.telos.net', - port: 443, - path: '/evm', +const config: NetworkConfig = +{ + 'network': 'telos-evm', + 'display': 'Telos EVM', + 'chainId': '40', + 'isTestnet': false, + 'logos': { + 'large': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png', + 'small': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png', + }, + 'systemTokens': [ + { + 'name': 'Telos', + 'symbol': 'TLOS', + 'network': 'telos-evm', + 'decimals': 18, + 'address': NativeCurrencyAddress, + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos.png', + 'isNative': false, + 'isSystem': true, + }, + { + 'name': 'Staked Telos', + 'symbol': 'STLOS', + 'network': 'telos-evm', + 'decimals': 18, + 'address': '0xB4B01216a5Bc8F1C8A33CD990A1239030E60C905', + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/stlos.png', + 'isNative': false, + 'isSystem': false, + }, + { + 'name': 'Wrapped Telos', + 'symbol': 'WTLOS', + 'network': 'telos-evm', + 'decimals': 18, + 'address': '0xD102cE6A4dB07D247fcc28F366A623Df0938CA9E', + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/wtlos.png', + 'isNative': false, + 'isSystem': false, + }, + ], + 'escrowContractAddress': '0x95F5713A1422Aa3FBD3DCB8D553945C128ee3855', + 'apiEndpoints': { + 'rpc': { + 'protocol': 'https', + 'host': 'mainnet.telos.net', + 'port': 443, + 'path': '/evm', + }, + 'api': 'https://api.telos.net/v1', + 'hyperion': 'https://mainnet.telos.net', + 'explorer': 'https://teloscan.io', + 'ecosystem': 'https://www.telos.net/ecosystem', + 'bridge': 'https://bridge.telos.net/bridge', + 'indexer': 'https://api.teloscan.io', + 'contractsBucket': 'https://verified-evm-contracts.s3.amazonaws.com', + 'monitor': 'https://api.monitor-test.telos.net', + }, + 'priceData': { + 'coingeckoId': 'telos', + }, + 'weiPrecision': 18, + 'themes': { + 'light': { + 'primary': '#2a8de3', + 'secondary': '#8B3F98', + 'accent': '#73C58F', + 'dark': '#1d1d1d', + 'positive': '#008800', + 'negative': '#880000', + 'info': '#31CCEC', + 'warning': '#F2C037', + 'notify-success': '#255B00', + 'notify-error': '#880000', + 'notify-neutral': '#4D4D4D', + 'notify-info': '#008888', + }, + 'dark': { + 'primary': '#2a8de3', + 'secondary': '#8B3F98', + 'accent': '#73C58F', + 'dark': '#1d1d1d', + 'positive': '#008800', + 'negative': '#880000', + 'info': '#31CCEC', + 'warning': '#F2C037', + 'notify-success': '#469d0d', + 'notify-error': '#b30909', + 'notify-neutral': '#858585', + 'notify-info': '#15baba', + }, + }, + 'socialLinks': [ + { + 'name': 'Telegram', + 'url': 'http://t.me/HelloTelos', + 'icon': 'telegram', + 'classSuffix': 'telegram', + }, + { + 'name': 'X (Twitter)', + 'url': 'https://twitter.com/HelloTelos', + 'icon': 'twitter', + 'classSuffix': 'x-twitter', + }, + { + 'name': 'YouTube', + 'url': 'https://www.youtube.com/@TheTelosNetwork', + 'icon': 'youtube', + 'classSuffix': 'youtube', + }, + { + 'name': 'Discord', + 'url': 'https://discord.gg/telos', + 'icon': 'discord', + 'classSuffix': 'discord', + }, + ], + 'footerLinks': { + 'chain': 'telos-evm', + 'branding': { + 'title': 'Telos Testnet', + 'logoLight': '/assets/telos-new-logo.png', + 'logoDark': '/assets/telos-new-logo--dark.png', + 'url': 'https://testnet.telos.net/', + }, + 'columns': [ + { + 'title': 'components.footer.telos', + 'links': [ + { 'label': 'components.footer.telos_homepage', 'url': 'https://www.telos.net/' }, + { 'label': 'components.footer.telos_wallet', 'url': 'https://wallet.telos.net/' }, + { 'label': 'components.footer.telos_bridge', 'url': 'https://bridge.telos.net/bridge' }, + { 'label': 'components.footer.telos_zero_explorer', 'url': 'https://explorer.telos.net/network' }, + { 'label': 'components.footer.buy_telos', 'url': 'https://www.telos.net/buy' }, + { 'label': 'components.footer.stake_telos', 'url': 'https://docs.telos.net/users/knowledge-base/how-to-stake-tlos/' }, + { 'label': 'components.footer.telos_ecosystem', 'url': 'https://www.telos.net/ecosystem' }, + { 'label': 'components.footer.network_status', 'url': 'https://www.teloscan.io/health' }, + ], + }, + { + 'title': 'components.footer.about', + 'links': [ + { 'label': 'components.footer.about_us', 'url': 'https://www.telos.net/about' }, + { 'label': 'components.footer.contactUs', 'url': 'http://t.me/HelloTelos' }, + ], + }, + { + 'title': 'components.footer.build', + 'links': [ + { 'label': 'components.footer.api_documentation', 'url': 'https://api.telosscan.io/v1/docs' }, + { 'label': 'components.footer.telos_documentation', 'url': 'https://docs.telos.net/overview/what-is-telos/introduction/' }, + { 'label': 'components.footer.github', 'url': 'https://github.com/telosnetwork' }, + { 'label': 'components.footer.brand_assets', 'url': 'https://www.telos.net/community-resources' }, + ], + }, + ], + }, + 'headerMenuConfig': { + 'chain': 'telos-evm', + 'entries': [ + { + 'label': 'components.header.home', + 'internalLink': 'home', + }, + { + 'label': 'components.header.blockchain', + 'entries': [ + { + 'label': 'components.header.internal_transactions', + 'internalLink': 'txsinternal', + }, + { + 'label': 'components.header.transactions', + 'internalLink': 'transactions', + }, + { + 'label': 'components.header.blocks', + 'internalLink': 'blocks', + }, + ], + }, + { + 'label': 'components.header.developers', + 'entries': [ + { + 'label': 'components.header.api_documentation', + 'externalLink': 'https://api.telosscan.io/v1/docs', + }, + { + 'label': 'components.header.verify_contract_sourcify', + 'externalLink': 'https://sourcify.dev/', + }, + ], + }, + { + 'label': 'components.header.telos_wallet', + 'externalLink': 'https://wallet.telos.net/', + }, + { + 'label': 'components.header.telos_bridge', + 'externalLink': 'https://bridge.telos.net/bridge', + }, + { + 'label': 'components.header.more', + 'entries': [ + { + 'label': 'global.language', + 'trigger': 'language', + 'leftIcon': 'fas fa-language', + }, + { + 'label': 'components.header.csv_export', + 'internalLink': 'export', + }, + { + 'label': 'components.header.health_monitor', + 'internalLink': 'health', + }, + { + 'label': 'components.header.telos_ecosystem', + 'externalLink': 'https://www.telos.net/ecosystem', + }, + { + 'label': 'components.header.telos_zero_explorer', + 'externalLink': 'https://explorer.telos.net', + }, + ], + }, + ], + }, + 'buyMoreTokenLink': 'https://www.telos.net/buy', + 'nativeUalChain': { + 'chainId': '4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11', + 'rpcEndpoints': [ + { + 'protocol': 'https', + 'host': 'mainnet.telos.net', + 'port': 443, + }, + ], + }, }; -const ESCROW_CONTRACT_ADDRESS = '0x95F5713A1422Aa3FBD3DCB8D553945C128ee3855'; -const API_ENDPOINT = 'https://api.telos.net/v1'; -const WEI_PRECISION = 18; -const EXPLORER_URL = 'https://teloscan.io'; -const ECOSYSTEM_URL = 'https://www.telos.net/ecosystem'; -const BRIDGE_URL = 'https://bridge.telos.net/bridge'; -const NETWORK_EVM_ENDPOINT = 'https://mainnet.telos.net'; -const INDEXER_ENDPOINT = 'https://api.teloscan.io'; -const CONTRACTS_BUCKET = 'https://verified-evm-contracts.s3.amazonaws.com'; -declare const fathom: { trackEvent: (eventName: string) => void }; +console.log('telos-evm:', config); -// UAL chain -const NETWORK_CHAIN_ID = '4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11'; -const NETWORK_PROTOCOL = 'https'; -const NETWORK_PORT = 443; -const NETWORK_HOST = 'mainnet.telos.net'; export default class TelosEVM extends EVMChainSettings { nativeSupport: TelosEvmApi; + _systemToken: TokenClass = new TokenClass(config.systemTokens[0] as TokenSourceInfo); + _stakedSystemToken: TokenClass = new TokenClass(config.systemTokens[1] as TokenSourceInfo); + _wrappedSystemToken: TokenClass = new TokenClass(config.systemTokens[2] as TokenSourceInfo); constructor(network: string) { super(network); this.nativeSupport = new TelosEvmApi({ @@ -82,31 +273,30 @@ export default class TelosEVM extends EVMChainSettings { telosPrivateKeys: [], fetch, }); - console.assert(network === NETWORK, `Network name mismatch: '${network}' !== '${NETWORK}'`); } getNetwork(): string { - return NETWORK; + return config.network; } getChainId(): string { - return CHAIN_ID; + return config.chainId; } getDisplay(): string { - return DISPLAY; + return config.display; } getHyperionEndpoint(): string { - return NETWORK_EVM_ENDPOINT; + return config.apiEndpoints.hyperion; } getRPCEndpoint(): RpcEndpoint { - return RPC_ENDPOINT; + return config.apiEndpoints.rpc; } getApiEndpoint(): string { - return API_ENDPOINT; + return config.apiEndpoints.api; } getPriceData(): Promise { @@ -114,19 +304,19 @@ export default class TelosEVM extends EVMChainSettings { } getSystemToken(): TokenClass { - return TOKEN; + return this._systemToken; } getStakedSystemToken(): TokenClass { - return S_TOKEN; + return this._stakedSystemToken; } getWrappedSystemToken(): TokenClass { - return W_TOKEN; + return this._wrappedSystemToken; } getEscrowContractAddress(): addressString { - return ESCROW_CONTRACT_ADDRESS; + return config.escrowContractAddress as addressString; } async getUsdPrice(): Promise { @@ -144,228 +334,67 @@ export default class TelosEVM extends EVMChainSettings { } getLargeLogoPath(): string { - return LOGO; + return config.logos.large; } getSmallLogoPath(): string { - return LOGO; + return config.logos.small; } getWeiPrecision(): number { - return WEI_PRECISION; + return config.weiPrecision; } getExplorerUrl(): string { - return EXPLORER_URL; + return config.apiEndpoints.explorer; } getEcosystemUrl(): string { - return ECOSYSTEM_URL; + return config.apiEndpoints.ecosystem; } getThemes(): Themes { - return { - light: { - primary: '#2a8de3', - secondary: '#8B3F98', - accent: '#73C58F', - dark: '#1d1d1d', - positive: '#008800', - negative: '#880000', - info: '#31CCEC', - warning: '#F2C037', - 'notify-success': '#255B00', - 'notify-error': '#880000', - 'notify-neutral': '#4D4D4D', - 'notify-info': '#008888', - }, - dark: { - primary: '#2a8de3', - secondary: '#8B3F98', - accent: '#73C58F', - dark: '#1d1d1d', - positive: '#008800', - negative: '#880000', - info: '#31CCEC', - warning: '#F2C037', - 'notify-success': '#469d0d', - 'notify-error': '#b30909', - 'notify-neutral': '#858585', - 'notify-info': '#15baba', - }, - }; + return config.themes; } getSocialLinks(): SocialLink[] { - return [ - { - name: 'Telegram', - url: 'http://t.me/HelloTelos', - icon: 'telegram', - classSuffix: 'telegram', - }, - { - name: 'X (Twitter)', - url: 'https://twitter.com/HelloTelos', - icon: 'twitter', - classSuffix: 'x-twitter', - }, - { - name: 'YouTube', - url: 'https://www.youtube.com/@TheTelosNetwork', - icon: 'youtube', - classSuffix: 'youtube', - }, - { - name: 'Discord', - url: 'https://discord.gg/telos', - icon: 'discord', - classSuffix: 'discord', - }, - ]; + return config.socialLinks; } getFooterLinks(): FooterLinksConfig { - return { - chain: 'telos-evm', - branding: { - title: 'Telos Testnet', - logoLight: '/assets/telos-new-logo.png', - logoDark: '/assets/telos-new-logo--dark.png', - url: 'https://testnet.telos.net/', - }, - columns: [ - { - title: 'components.footer.telos', - links: [ - { label: 'components.footer.telos_homepage', url: 'https://www.telos.net/' }, - { label: 'components.footer.telos_wallet', url: 'https://wallet.telos.net/' }, - { label: 'components.footer.telos_bridge', url: 'https://bridge.telos.net/bridge' }, - { label: 'components.footer.telos_zero_explorer', url: 'https://explorer.telos.net/network' }, - { label: 'components.footer.buy_telos', url: 'https://www.telos.net/buy' }, - { label: 'components.footer.stake_telos', url: 'https://docs.telos.net/users/knowledge-base/how-to-stake-tlos/' }, - { label: 'components.footer.telos_ecosystem', url: 'https://www.telos.net/ecosystem' }, - { label: 'components.footer.network_status', url: 'https://www.teloscan.io/health' }, - ], - }, - { - title: 'components.footer.about', - links: [ - { label: 'components.footer.about_us', url: 'https://www.telos.net/about' }, - { label: 'components.footer.contactUs', url: 'http://t.me/HelloTelos' }, - ], - }, - { - title: 'components.footer.build', - links: [ - { label: 'components.footer.api_documentation', url: 'https://api.teloscan.io/v1/docs' }, - { label: 'components.footer.telos_documentation', url: 'https://docs.telos.net/overview/what-is-telos/introduction/' }, - { label: 'components.footer.github', url: 'https://github.com/telosnetwork' }, - { label: 'components.footer.brand_assets', url: 'https://www.telos.net/community-resources' }, - ], - }, - ], - }; + return config.footerLinks; } getHeaderMenuConfig(): HeaderMenuConfig { - return { - chain: 'telos-evm', - entries: [ - { - label: 'components.header.home', - internalLink: 'home', - }, - { - label: 'components.header.blockchain', - entries: [ - { - label: 'components.header.internal_transactions', - internalLink: 'txsinternal', - }, - { - label: 'components.header.transactions', - internalLink: 'transactions', - }, - { - label: 'components.header.blocks', - internalLink: 'blocks', - }, - ], - }, - { - label: 'components.header.developers', - entries: [ - { - label: 'components.header.api_documentation', - externalLink: 'https://api.teloscan.io/v1/docs', - }, - { - label: 'components.header.verify_contract_sourcify', - externalLink: 'https://sourcify.dev/', - }, - ], - }, - { - label: 'components.header.telos_wallet', - externalLink: 'https://wallet.telos.net/', - }, - { - label: 'components.header.telos_bridge', - externalLink: 'https://bridge.telos.net/bridge', - }, - { - label: 'components.header.more', - entries: [ - { - label: 'global.language', - trigger: 'language', - leftIcon: 'fas fa-language', - }, - { - label: 'components.header.csv_export', - internalLink: 'export', - }, - { - label: 'components.header.health_monitor', - internalLink: 'health', - }, - { - label: 'components.header.telos_ecosystem', - externalLink: 'https://www.telos.net/ecosystem', - }, - { - label: 'components.header.telos_zero_explorer', - externalLink: 'https://explorer.telos.net', - }, - ], - }, - ], - }; + return config.headerMenuConfig; } getBridgeUrl(): string { - return BRIDGE_URL; + return config.apiEndpoints.bridge; } getTrustedContractsBucket(): string { - return CONTRACTS_BUCKET; + return config.apiEndpoints.contractsBucket; } getBuyMoreOfTokenLink(): string { - return 'https://www.telos.net/buy'; + return config.buyMoreTokenLink; } getSystemTokens(): TokenClass[] { - return [TOKEN, S_TOKEN, W_TOKEN]; + return [ + this.getSystemToken(), + this.getStakedSystemToken(), + this.getWrappedSystemToken(), + ]; } getIndexerApiEndpoint(): string { - return INDEXER_ENDPOINT; + return config.apiEndpoints.indexer as string; } hasIndexerSupport(): boolean { - return true; + return config.apiEndpoints.indexer !== undefined; } trackAnalyticsEvent(eventName: string): void { @@ -383,16 +412,7 @@ export default class TelosEVM extends EVMChainSettings { } getNativeUALChain() { - return { - chainId: NETWORK_CHAIN_ID, - rpcEndpoints: [ - { - protocol: NETWORK_PROTOCOL, - host: NETWORK_HOST, - port: NETWORK_PORT, - }, - ], - }; + return config.nativeUalChain; } async getEthAccountByNativeAccount(native: string): Promise { @@ -405,7 +425,7 @@ export default class TelosEVM extends EVMChainSettings { } getMonitorUrl(): string { - return 'https://api.monitor-test.telos.net'; + return config.apiEndpoints.monitor as string; } } diff --git a/src/core/types/NetworkConfig.ts b/src/core/types/NetworkConfig.ts new file mode 100644 index 00000000..c4128c02 --- /dev/null +++ b/src/core/types/NetworkConfig.ts @@ -0,0 +1,152 @@ +export interface NetworkConfig { + // The unique network identifier + network: string; + + // A human-readable name for display purposes + display: string; + + // The chain ID associated with this network + chainId: string; + + // Whether this network is a testnet + isTestnet: boolean; + + // Logo paths + logos: { + large: string; + small: string; + }; + + // System tokens used by this network + systemTokens: { + name: string; + symbol: string; + network: string; + decimals: number; + address: string; + logo: string; + isNative: boolean; + isSystem: boolean; + }[]; + + // The escrow contract address + escrowContractAddress: string; + + // Various endpoints required by the network + apiEndpoints: { + rpc: { + protocol: string; + host: string; + port: number; + path?: string; + }; + api: string; + hyperion: string; + explorer: string; + ecosystem: string; + bridge: string; + indexer?: string; + contractsBucket: string; + monitor?: string; + }; + + // Price data sources + priceData: { + coingeckoId: string; + }; + + // The default wei precision + weiPrecision: number; + + // Themes configuration (light and dark) + themes: { + light: { + primary: string; + secondary: string; + accent: string; + dark: string; + positive: string; + negative: string; + info: string; + warning: string; + 'notify-success': string; + 'notify-error': string; + 'notify-neutral': string; + 'notify-info': string; + }; + dark: { + primary: string; + secondary: string; + accent: string; + dark: string; + positive: string; + negative: string; + info: string; + warning: string; + 'notify-success': string; + 'notify-error': string; + 'notify-neutral': string; + 'notify-info': string; + }; + }; + + // Social links configuration + socialLinks: { + name: string; + url: string; + icon: string; + classSuffix: string; + }[]; + + // Footer links configuration + footerLinks: { + chain: string; + branding: { + title: string; + logoLight: string; + logoDark: string; + url: string; + }; + columns: { + title: string; + links: { + label: string; + url: string; + }[]; + }[]; + }; + + // Header menu configuration + headerMenuConfig: { + chain: string; + entries: { + label: string; + internalLink?: string; + externalLink?: string; + trigger?: string; + leftIcon?: string; + entries?: { + label: string; + trigger?: string; + leftIcon?: string; + internalLink?: string; + externalLink?: string; + }[]; + }[]; + }; + + // Link to buy more tokens + buyMoreTokenLink: string; + + // Native UAL chain configuration + nativeUalChain: { + chainId: string; + rpcEndpoints: { + protocol: string; + host: string; + port: number; + }[]; + }; +} + + diff --git a/src/core/types/index.ts b/src/core/types/index.ts index 04ccf24b..f1e550ce 100644 --- a/src/core/types/index.ts +++ b/src/core/types/index.ts @@ -14,6 +14,7 @@ export * from 'src/core/types/Filters'; export * from 'src/core/types/IndexerTypes'; export * from 'src/core/types/KeyAccounts'; export * from 'src/core/types/Basic'; +export * from 'src/core/types/NetworkConfig'; export * from 'src/core/types/NFTClass'; export * from 'src/core/types/OpenSeaTypes'; export * from 'src/core/types/PriceData'; From 722a6296d48216ad3c60797d6b4c6af092e09973 Mon Sep 17 00:00:00 2001 From: Viterbo Date: Mon, 16 Dec 2024 15:09:40 -0300 Subject: [PATCH 02/13] fixing typo telosscan --- src/config/chains/telos-evm-testnet/index.ts | 2 +- src/config/chains/telos-evm/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config/chains/telos-evm-testnet/index.ts b/src/config/chains/telos-evm-testnet/index.ts index 78978439..eeb90435 100644 --- a/src/config/chains/telos-evm-testnet/index.ts +++ b/src/config/chains/telos-evm-testnet/index.ts @@ -65,7 +65,7 @@ const config: NetworkConfig = 'explorer': 'https://testnet.teloscan.io', 'ecosystem': 'https://www.telos.net/ecosystem', 'bridge': 'https://telos-bridge-testnet.netlify.app/bridge', - 'indexer': 'https://api.testnet.telosscan.io', + 'indexer': 'https://api.testnet.teloscan.io', 'contractsBucket': 'https://verified-evm-contracts-testnet.s3.amazonaws.com', 'monitor': 'https://api.monitor-test.telos.net', }, diff --git a/src/config/chains/telos-evm/index.ts b/src/config/chains/telos-evm/index.ts index e9a3ba88..808d2d43 100644 --- a/src/config/chains/telos-evm/index.ts +++ b/src/config/chains/telos-evm/index.ts @@ -161,7 +161,7 @@ const config: NetworkConfig = { 'title': 'components.footer.build', 'links': [ - { 'label': 'components.footer.api_documentation', 'url': 'https://api.telosscan.io/v1/docs' }, + { 'label': 'components.footer.api_documentation', 'url': 'https://api.teloscan.io/v1/docs' }, { 'label': 'components.footer.telos_documentation', 'url': 'https://docs.telos.net/overview/what-is-telos/introduction/' }, { 'label': 'components.footer.github', 'url': 'https://github.com/telosnetwork' }, { 'label': 'components.footer.brand_assets', 'url': 'https://www.telos.net/community-resources' }, @@ -198,7 +198,7 @@ const config: NetworkConfig = 'entries': [ { 'label': 'components.header.api_documentation', - 'externalLink': 'https://api.telosscan.io/v1/docs', + 'externalLink': 'https://api.teloscan.io/v1/docs', }, { 'label': 'components.header.verify_contract_sourcify', From b4ce44723a93098cb49cd8613a894d7f608028ce Mon Sep 17 00:00:00 2001 From: Viterbo Date: Fri, 20 Dec 2024 20:32:48 -0300 Subject: [PATCH 03/13] multichain config enhanced and xk network added --- env.js | 4 +- public/networks/telos-zkevm-logo-256.png | Bin 0 -> 36724 bytes public/networks/telos-zkevm-logo-32.png | Bin 0 -> 6819 bytes src/App.vue | 3 +- src/config/chains/index.ts | 2 + src/config/chains/telos-evm-testnet/index.ts | 16 +- src/config/chains/telos-evm/index.ts | 16 +- .../chains/telos-zkevm-testnet/index.ts | 391 ++++++++++++++++++ src/core/chains/EVMChainSettings.ts | 4 + src/core/mocks/ChainStore.ts | 4 + src/core/mocks/chain-constants.ts | 2 - src/core/types/NetworkConfig.ts | 7 + .../authenticators/InjectedProviderAuth.ts | 3 +- .../authenticators/WalletConnectAuth.ts | 3 +- src/lib/contract/ContractManager.js | 12 +- src/lib/multichain-utils.ts | 19 +- src/store/chain/actions.js | 2 +- 17 files changed, 460 insertions(+), 28 deletions(-) create mode 100644 public/networks/telos-zkevm-logo-256.png create mode 100644 public/networks/telos-zkevm-logo-32.png create mode 100644 src/config/chains/index.ts create mode 100644 src/config/chains/telos-zkevm-testnet/index.ts diff --git a/env.js b/env.js index f3f9d379..fd283bdf 100644 --- a/env.js +++ b/env.js @@ -12,8 +12,8 @@ const sharedEnv = { const TESTNET = { ...sharedEnv, - APP_NAME: 'Teloscan (testnet)', - NETWORK_EVM_NAME: 'telos-evm-testnet', + APP_NAME: 'Teloscan zkEVM (testnet)', + NETWORK_EVM_NAME: 'telos-zkevm-testnet', // 'telos-zkevm-testnet', telos-evm-testnet }; const MAINNET = { diff --git a/public/networks/telos-zkevm-logo-256.png b/public/networks/telos-zkevm-logo-256.png new file mode 100644 index 0000000000000000000000000000000000000000..ae44fe84b95d392ec9754e69a21355c465fa21f6 GIT binary patch literal 36724 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 F{{Y^`2Ic?& literal 0 HcmV?d00001 diff --git a/src/App.vue b/src/App.vue index d75b78a7..722e621e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,7 +6,8 @@ import { useQuasar } from 'quasar'; import moment from 'moment'; import { getCore, useChainStore } from 'src/core'; -import { TELOS_NETWORK_NAMES } from 'src/core/mocks/chain-constants'; + +import { TELOS_NETWORK_NAMES } from 'src/config/chains'; import { providerManager } from 'src/boot/evm'; import { useRoute } from 'vue-router'; diff --git a/src/config/chains/index.ts b/src/config/chains/index.ts new file mode 100644 index 00000000..ac9908da --- /dev/null +++ b/src/config/chains/index.ts @@ -0,0 +1,2 @@ +export const TELOS_CHAIN_IDS = ['40', '41', '1310']; +export const TELOS_NETWORK_NAMES = ['telos-evm', 'telos-evm-testnet', 'telos-zkevm-testnet']; diff --git a/src/config/chains/telos-evm-testnet/index.ts b/src/config/chains/telos-evm-testnet/index.ts index eeb90435..e7ddecfd 100644 --- a/src/config/chains/telos-evm-testnet/index.ts +++ b/src/config/chains/telos-evm-testnet/index.ts @@ -56,12 +56,12 @@ const config: NetworkConfig = 'apiEndpoints': { 'rpc': { 'protocol': 'https', - 'host': 'testnet.telos.net', + 'host': 'rpc.testnet.telos.net', 'port': 443, 'path': '/evm', }, 'api': 'https://api-dev.telos.net/v1', - 'hyperion': 'https://testnet.telos.net', + 'hyperion': 'https://rpc.testnet.telos.net', 'explorer': 'https://testnet.teloscan.io', 'ecosystem': 'https://www.telos.net/ecosystem', 'bridge': 'https://telos-bridge-testnet.netlify.app/bridge', @@ -103,6 +103,8 @@ const config: NetworkConfig = 'notify-info': '#0099FF', }, }, + 'tokenListUrl': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.tokenlist.json', + 'systemContractsListUrl': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.systemcontractlist.json', 'socialLinks': [ { 'name': 'X (Twitter)', @@ -195,7 +197,7 @@ const config: NetworkConfig = 'rpcEndpoints': [ { 'protocol': 'https', - 'host': 'testnet.telos.net', + 'host': 'rpc.testnet.telos.net', 'port': 443, }, ], @@ -337,6 +339,14 @@ export default class TelosEVM extends EVMChainSettings { ]; } + getTokenListUrl(): string { + return config.tokenListUrl; + } + + getSystemContractsListUrl(): string { + return config.systemContractsListUrl; + } + getIndexerApiEndpoint(): string { return config.apiEndpoints.indexer as string; } diff --git a/src/config/chains/telos-evm/index.ts b/src/config/chains/telos-evm/index.ts index 808d2d43..7155e36b 100644 --- a/src/config/chains/telos-evm/index.ts +++ b/src/config/chains/telos-evm/index.ts @@ -56,12 +56,12 @@ const config: NetworkConfig = 'apiEndpoints': { 'rpc': { 'protocol': 'https', - 'host': 'mainnet.telos.net', + 'host': 'rpc.telos.net', 'port': 443, 'path': '/evm', }, 'api': 'https://api.telos.net/v1', - 'hyperion': 'https://mainnet.telos.net', + 'hyperion': 'https://rpc.telos.net', 'explorer': 'https://teloscan.io', 'ecosystem': 'https://www.telos.net/ecosystem', 'bridge': 'https://bridge.telos.net/bridge', @@ -103,6 +103,8 @@ const config: NetworkConfig = 'notify-info': '#15baba', }, }, + 'tokenListUrl': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.tokenlist.json', + 'systemContractsListUrl': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.systemcontractlist.json', 'socialLinks': [ { 'name': 'Telegram', @@ -248,7 +250,7 @@ const config: NetworkConfig = 'rpcEndpoints': [ { 'protocol': 'https', - 'host': 'mainnet.telos.net', + 'host': 'rpc.telos.net', 'port': 443, }, ], @@ -389,6 +391,14 @@ export default class TelosEVM extends EVMChainSettings { ]; } + getTokenListUrl(): string { + return config.tokenListUrl; + } + + getSystemContractsListUrl(): string { + return config.systemContractsListUrl; + } + getIndexerApiEndpoint(): string { return config.apiEndpoints.indexer as string; } diff --git a/src/config/chains/telos-zkevm-testnet/index.ts b/src/config/chains/telos-zkevm-testnet/index.ts new file mode 100644 index 00000000..1e39a14d --- /dev/null +++ b/src/config/chains/telos-zkevm-testnet/index.ts @@ -0,0 +1,391 @@ +import EVMChainSettings from 'src/core/chains/EVMChainSettings'; +import { RpcEndpoint } from 'universal-authenticator-library'; +import { FooterLinksConfig, HeaderMenuConfig, NativeCurrencyAddress, NetworkConfig, PriceChartData, SocialLink, Themes, addressString } from 'src/core/types'; +import { TokenClass, TokenSourceInfo } from 'src/core/types'; +import { useUserStore } from 'src/core'; +import { getFiatPriceFromIndexer, getCoingeckoPriceChartData, getCoingeckoUsdPrice } from 'src/lib/price'; + +declare const fathom: { trackEvent: (eventName: string) => void }; + +// specific for Telos +import { TelosEvmApi } from '@telosnetwork/telosevm-js'; + +const config: NetworkConfig = +{ + 'network': 'telos-zkevm-testnet', + 'display': 'TelosZKEVM (Testnet)', + 'chainId': '1310', + 'isTestnet': true, + 'logos': { + 'large': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos-zkevm-logo-256.png', + 'small': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos-zkevm-logo-32.png', + }, + 'systemTokens': [ + { + 'name': 'Telos ZKEVM', + 'symbol': 'tTLOS', + 'network': 'telos-zkevm-testnet', + 'decimals': 18, + 'address': NativeCurrencyAddress, + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/telos-zkevm-logo-32.png', + 'isNative': false, + 'isSystem': true, + }, + // FIXME: missing staked and wrapped tokens. Do they even exist? + { + 'name': 'Staked Telos', + 'symbol': 'STLOS', + 'network': 'telos-evm', + 'decimals': 18, + 'address': '0xB4B01216a5Bc8F1C8A33CD990A1239030E60C905', + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/stlos.png', + 'isNative': false, + 'isSystem': false, + }, + { + 'name': 'Wrapped Telos', + 'symbol': 'WTLOS', + 'network': 'telos-evm', + 'decimals': 18, + 'address': '0xD102cE6A4dB07D247fcc28F366A623Df0938CA9E', + 'logo': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/logos/wtlos.png', + 'isNative': false, + 'isSystem': false, + }, + ], + // FIXME: missing escrowContractAddress + 'escrowContractAddress': '', + 'apiEndpoints': { + 'rpc': { + 'protocol': 'http', + 'host': 'zkrpc.testnet.telos.net', + 'port': 8124, + 'path': '/evm', + }, + 'api': 'http://localhost:8800/v1', + 'hyperion': 'http://34.57.215.93:8124/', + 'explorer': 'https://teloscan.io', + 'ecosystem': 'https://www.telos.net/ecosystem', + 'bridge': 'https://bridge.telos.net/bridge', + 'indexer': 'http://localhost:8800/', + 'contractsBucket': 'https://verified-evm-contracts.s3.amazonaws.com', + 'monitor': 'https://api.monitor-test.telos.net', + }, + 'priceData': { + 'coingeckoId': 'telos', + }, + 'weiPrecision': 18, + 'themes': { + 'light': { + 'primary': '#2ae8d3', + 'secondary': '#8FB398', + 'accent': '#7583CF', + 'dark': '#1d1d1d', + 'positive': '#008800', + 'negative': '#880000', + 'info': '#31CCEC', + 'warning': '#F2C037', + 'notify-success': '#255B00', + 'notify-error': '#880000', + 'notify-neutral': '#4D4D4D', + 'notify-info': '#008888', + }, + 'dark': { + 'primary': '#4b95aa', + 'secondary': '#5b8cde', + 'accent': '#ffa1e4', + 'dark': '#1d1d1d', + 'positive': '#008800', + 'negative': '#880000', + 'info': '#31CCEC', + 'warning': '#F2C037', + 'notify-success': '#469d0d', + 'notify-error': '#b30909', + 'notify-neutral': '#858585', + 'notify-info': '#15baba', + }, + }, + 'tokenListUrl': 'https://raw.githubusercontent.com/telosnetwork/token-list/refs/heads/main/teloszkevm.tokenlist.json', + 'systemContractsListUrl': 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.systemcontractlist.json', + + 'socialLinks': [ + { + 'name': 'Telegram', + 'url': 'http://t.me/HelloTelos', + 'icon': 'telegram', + 'classSuffix': 'telegram', + }, + { + 'name': 'X (Twitter)', + 'url': 'https://twitter.com/HelloTelos', + 'icon': 'twitter', + 'classSuffix': 'x-twitter', + }, + { + 'name': 'YouTube', + 'url': 'https://www.youtube.com/@TheTelosNetwork', + 'icon': 'youtube', + 'classSuffix': 'youtube', + }, + { + 'name': 'Discord', + 'url': 'https://discord.gg/telos', + 'icon': 'discord', + 'classSuffix': 'discord', + }, + ], + 'footerLinks': { + 'chain': 'telos-zkevm-testnet', + 'branding': { + 'title': 'Telos Testnet', + 'logoLight': '/assets/telos-new-logo.png', + 'logoDark': '/assets/telos-new-logo--dark.png', + 'url': 'https://testnet.telos.net/', + }, + 'columns': [ + { + 'title': 'components.footer.telos', + 'links': [ + { 'label': 'components.footer.telos_homepage', 'url': 'https://zkevm.telos.net/' }, + ], + }, + { + 'title': 'components.footer.about', + 'links': [ + { 'label': 'components.footer.about_us', 'url': 'https://zkevm.telos.net/' }, + { 'label': 'components.footer.contactUs', 'url': 'http://t.me/HelloTelos' }, + ], + }, + ], + }, + 'headerMenuConfig': { + 'chain': 'telos-zkevm-testnet', + 'entries': [ + { + 'label': 'components.header.home', + 'internalLink': 'home', + }, + { + 'label': 'components.header.blockchain', + 'entries': [ + { + 'label': 'components.header.internal_transactions', + 'internalLink': 'txsinternal', + }, + { + 'label': 'components.header.transactions', + 'internalLink': 'transactions', + }, + { + 'label': 'components.header.blocks', + 'internalLink': 'blocks', + }, + ], + }, + { + 'label': 'components.header.more', + 'entries': [ + { + 'label': 'global.language', + 'trigger': 'language', + 'leftIcon': 'fas fa-language', + }, + ], + }, + ], + }, + 'buyMoreTokenLink': 'https://www.telos.net/buy', + 'nativeUalChain': { + 'chainId': '4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11', + 'rpcEndpoints': [ + { + 'protocol': 'https', + 'host': 'rpc.telos.net', + 'port': 443, + }, + ], + }, +}; + +console.log('telos-zkevm-testnet:', config); + + +export default class TelosZkEVM extends EVMChainSettings { + nativeSupport: TelosEvmApi; + _systemToken: TokenClass = new TokenClass(config.systemTokens[0] as TokenSourceInfo); + _stakedSystemToken: TokenClass = new TokenClass(config.systemTokens[1] as TokenSourceInfo); + _wrappedSystemToken: TokenClass = new TokenClass(config.systemTokens[2] as TokenSourceInfo); + constructor(network: string) { + super(network); + this.nativeSupport = new TelosEvmApi({ + endpoint: this.getHyperionEndpoint(), + chainId: parseInt(this.getChainId()), + ethPrivateKeys: [], + telosContract: this.getEscrowContractAddress(), + telosPrivateKeys: [], + fetch, + }); + } + + getNetwork(): string { + return config.network; + } + + getChainId(): string { + return config.chainId; + } + + getDisplay(): string { + return config.display; + } + + getHyperionEndpoint(): string { + return config.apiEndpoints.hyperion; + } + + getRPCEndpoint(): RpcEndpoint { + return config.apiEndpoints.rpc; + } + + getApiEndpoint(): string { + return config.apiEndpoints.api; + } + + getPriceData(): Promise { + return getCoingeckoPriceChartData('telos'); + } + + getSystemToken(): TokenClass { + return this._systemToken; + } + + getStakedSystemToken(): TokenClass { + return this._stakedSystemToken; + } + + getWrappedSystemToken(): TokenClass { + return this._wrappedSystemToken; + } + + getEscrowContractAddress(): addressString { + return config.escrowContractAddress as addressString; + } + + async getUsdPrice(): Promise { + if (this.hasIndexerSupport() && this.isIndexerHealthy()) { + const nativeTokenSymbol = this.getSystemToken().symbol; + const fiatCode = useUserStore().fiatCurrency; + const fiatPrice = await getFiatPriceFromIndexer(nativeTokenSymbol, NativeCurrencyAddress, fiatCode, this.indexer, this); + + if (fiatPrice !== 0) { + return fiatPrice; + } + } + + return await getCoingeckoUsdPrice('telos'); + } + + getLargeLogoPath(): string { + return config.logos.large; + } + + getSmallLogoPath(): string { + return config.logos.small; + } + + getWeiPrecision(): number { + return config.weiPrecision; + } + + getExplorerUrl(): string { + return config.apiEndpoints.explorer; + } + + getEcosystemUrl(): string { + return config.apiEndpoints.ecosystem; + } + + getThemes(): Themes { + return config.themes; + } + + getSocialLinks(): SocialLink[] { + return config.socialLinks; + } + + getFooterLinks(): FooterLinksConfig { + return config.footerLinks; + } + + getHeaderMenuConfig(): HeaderMenuConfig { + return config.headerMenuConfig; + } + + getBridgeUrl(): string { + return config.apiEndpoints.bridge; + } + + getTrustedContractsBucket(): string { + return config.apiEndpoints.contractsBucket; + } + + getBuyMoreOfTokenLink(): string { + return config.buyMoreTokenLink; + } + + getSystemTokens(): TokenClass[] { + return [ + this.getSystemToken(), + this.getStakedSystemToken(), + this.getWrappedSystemToken(), + ]; + } + + getTokenListUrl(): string { + return config.tokenListUrl; + } + + getSystemContractsListUrl(): string { + return config.systemContractsListUrl; + } + + getIndexerApiEndpoint(): string { + return config.apiEndpoints.indexer as string; + } + + hasIndexerSupport(): boolean { + return config.apiEndpoints.indexer !== undefined; + } + + trackAnalyticsEvent(eventName: string): void { + if (typeof fathom === 'undefined') { + console.warn(`Failed to track event with name '${eventName}': Fathom Analytics not loaded`); + return; + } + + fathom.trackEvent(eventName); + } + + // teloscan specific + getNativeSupport(): TelosEvmApi | null { + return this.nativeSupport; + } + + getNativeUALChain() { + return config.nativeUalChain; + } + + async getEthAccountByNativeAccount(native: string): Promise { + const account = await this.nativeSupport.telos.getEthAccountByTelosAccount(native); + if (account) { + return account.address; + } else { + return ''; + } + } + + getMonitorUrl(): string { + return config.apiEndpoints.monitor as string; + } + +} diff --git a/src/core/chains/EVMChainSettings.ts b/src/core/chains/EVMChainSettings.ts index 0a60e9ab..625a09b5 100644 --- a/src/core/chains/EVMChainSettings.ts +++ b/src/core/chains/EVMChainSettings.ts @@ -288,6 +288,10 @@ export default abstract class EVMChainSettings implements ChainSettings { return `~/assets/${this.network}/logo_sm.svg`; } + getTokensLogoURL(): string { + return `~/assets/${this.network}/tokens`; + } + abstract getSystemToken(): TokenClass; abstract getStakedSystemToken(): TokenClass; abstract getWrappedSystemToken(): TokenClass; diff --git a/src/core/mocks/ChainStore.ts b/src/core/mocks/ChainStore.ts index 378bb9c4..2640e284 100644 --- a/src/core/mocks/ChainStore.ts +++ b/src/core/mocks/ChainStore.ts @@ -11,6 +11,7 @@ import { ethers } from 'ethers'; import { TelosEvmApi } from '@telosnetwork/telosevm-js'; import { AxiosInstance } from 'axios'; import ContractManager from 'src/lib/contract/ContractManager'; +import TelosZkEVM from 'src/config/chains/telos-zkevm-testnet'; export interface TeloscanEVMChainSettings { getStakedSystemToken(): TokenClass; @@ -21,6 +22,8 @@ export interface TeloscanEVMChainSettings { getRPCEndpoint: () => RpcEndpoint; getEscrowContractAddress: () => string; getNetwork: () => string; + getTokenListUrl: () => string; + getSystemContractsListUrl: () => string; getSystemToken: () => TokenClass; getExplorerUrl: () => string; getSmallLogoPath: () => string; @@ -44,6 +47,7 @@ export interface TeloscanEVMChainSettings { } export const evmSettings: { [network: string]: TeloscanEVMChainSettings } = { + 'telos-zkevm-testnet': new TelosZkEVM('telos-zkevm-testnet'), 'telos-evm': new TelosEVM('telos-evm'), 'telos-evm-testnet': new TelosEVMTestnet('telos-evm-testnet'), }; diff --git a/src/core/mocks/chain-constants.ts b/src/core/mocks/chain-constants.ts index 0fee6a1d..128edde2 100644 --- a/src/core/mocks/chain-constants.ts +++ b/src/core/mocks/chain-constants.ts @@ -1,5 +1,3 @@ -export const TELOS_CHAIN_IDS = ['40', '41']; -export const TELOS_NETWORK_NAMES = ['telos-evm', 'telos-evm-testnet']; export const TELOS_ANALYTICS_EVENT_NAMES = { loginStarted: 'Login Started', loginSuccessful: 'Login Successful', diff --git a/src/core/types/NetworkConfig.ts b/src/core/types/NetworkConfig.ts index c4128c02..99b65580 100644 --- a/src/core/types/NetworkConfig.ts +++ b/src/core/types/NetworkConfig.ts @@ -147,6 +147,13 @@ export interface NetworkConfig { port: number; }[]; }; + + // url of the token tokenlist + tokenListUrl: string; + + // url of the system tokenlist + systemContractsListUrl: string; + } diff --git a/src/core/wallets/authenticators/InjectedProviderAuth.ts b/src/core/wallets/authenticators/InjectedProviderAuth.ts index c00c47ba..1110cf06 100644 --- a/src/core/wallets/authenticators/InjectedProviderAuth.ts +++ b/src/core/wallets/authenticators/InjectedProviderAuth.ts @@ -21,7 +21,8 @@ import { wtlosAbiWithdraw, } from 'src/core/types'; import { BraveAuthName, EVMAuthenticator, MetamaskAuthName, SafePalAuthName } from 'src/core/wallets'; -import { TELOS_ANALYTICS_EVENT_NAMES, TELOS_NETWORK_NAMES } from 'src/core/mocks/chain-constants'; +import { TELOS_ANALYTICS_EVENT_NAMES } from 'src/core/mocks/chain-constants'; +import { TELOS_NETWORK_NAMES } from 'src/config/chains'; export abstract class InjectedProviderAuth extends EVMAuthenticator { onReady = new BehaviorSubject(false); diff --git a/src/core/wallets/authenticators/WalletConnectAuth.ts b/src/core/wallets/authenticators/WalletConnectAuth.ts index b2c1b34d..085a2b37 100644 --- a/src/core/wallets/authenticators/WalletConnectAuth.ts +++ b/src/core/wallets/authenticators/WalletConnectAuth.ts @@ -42,7 +42,8 @@ import { import { EVMAuthenticator } from 'src/core/wallets'; import { RpcEndpoint } from 'universal-authenticator-library'; import { toRaw } from 'vue'; -import { TELOS_ANALYTICS_EVENT_NAMES, TELOS_NETWORK_NAMES } from 'src/core/mocks/chain-constants'; +import { TELOS_ANALYTICS_EVENT_NAMES } from 'src/core/mocks/chain-constants'; +import { TELOS_NETWORK_NAMES } from 'src/config/chains'; const name = 'WalletConnect'; diff --git a/src/lib/contract/ContractManager.js b/src/lib/contract/ContractManager.js index 28d1be71..41faf011 100644 --- a/src/lib/contract/ContractManager.js +++ b/src/lib/contract/ContractManager.js @@ -5,7 +5,7 @@ import { getTopicHash } from 'src/lib/utils'; import { ERC1155_TRANSFER_SIGNATURE, TRANSFER_SIGNATURES } from 'src/lib/abi/signature/transfer_signatures.js'; import { erc1155Abi, erc721MetadataAbi } from 'src/lib/abi'; import { getCore, useChainStore } from 'src/core'; -const tokenList = 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.tokenlist.json'; +// const tokenList = 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.tokenlist.json'; const systemContractList = 'https://raw.githubusercontent.com/telosnetwork/token-list/main/telosevm.systemcontractlist.json'; @@ -20,6 +20,14 @@ class AddressCacheManager { return useChainStore().currentChain.settings.getNetwork(); } + getTokenListUrl() { + return useChainStore().currentChain.settings.getTokenListUrl(); + } + + getSystemContractsListUrl() { + return useChainStore().currentChain.settings.getSystemContractsListUrl(); + } + loadFromLocalStorage() { const storedContractInfo = localStorage.getItem('contractInfoByNetwork'); if (storedContractInfo) { @@ -260,7 +268,7 @@ export default class ContractManager { } async loadTokenList() { - const results = await axios.get(tokenList); + const results = await axios.get(this.getTokenListUrl()); const { tokens } = results.data; results.data.tokens = (tokens ?? []).filter(({ chainId }) => +chainId === +useChainStore().currentChain.settings.getChainId()); diff --git a/src/lib/multichain-utils.ts b/src/lib/multichain-utils.ts index f3c71e82..b80d4f7b 100644 --- a/src/lib/multichain-utils.ts +++ b/src/lib/multichain-utils.ts @@ -1,5 +1,6 @@ import { evmSettings, TeloscanEVMChainSettings, useChainStore } from 'src/core'; import { CURRENT_CONTEXT } from 'src/core/mocks'; +import { TELOS_NETWORK_NAMES } from 'src/config/chains'; import { ref, watch } from 'vue'; import { RouteLocationNormalizedLoaded, Router } from 'vue-router'; @@ -9,18 +10,12 @@ export interface ChainOption { extern: boolean; } -export const chains = [ - { - network: 'telos-evm', - settings: evmSettings['telos-evm'], - extern: true, - }, - { - network: 'telos-evm-testnet', - settings: evmSettings['telos-evm-testnet'], - extern: true, - }, -] as ChainOption[]; +export const chains = TELOS_NETWORK_NAMES.map(network => ({ + network, + settings: evmSettings[network], + extern: true, +} as ChainOption)); + export const multichainSelectedNetwork = ref(undefined); diff --git a/src/store/chain/actions.js b/src/store/chain/actions.js index 785e1919..92eaf384 100644 --- a/src/store/chain/actions.js +++ b/src/store/chain/actions.js @@ -20,7 +20,7 @@ export const fetchTlosPrice = async function({ commit }) { const indexerApi = useChainStore().currentChain.settings.getIndexerApi(); const symbol = useChainStore().currentChain.settings.getSystemToken().symbol; const response = await indexerApi.get(`/v1/tokens/marketdata?tokens=${symbol}&vs=usd`); - const tlosPrice = parseFloat(response.data?.results[0].price).toFixed(4); + const tlosPrice = parseFloat(response.data?.results[0].price ?? '0.0').toFixed(4); commit('setTlosPrice', tlosPrice); } catch (error) { console.error('fetchTlosPrice: ', error.message); From 04ca8ef5a138d8feb8e607976fccdb2c6d52a250 Mon Sep 17 00:00:00 2001 From: Jesse Schulman Date: Fri, 20 Dec 2024 21:43:17 -0800 Subject: [PATCH 04/13] Better logic for env var --- env.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/env.js b/env.js index fd283bdf..f6f44346 100644 --- a/env.js +++ b/env.js @@ -10,18 +10,24 @@ const sharedEnv = { PROJECT_ID: '14ec76c44bae7d461fa0f5fd5f8a9da1', }; -const TESTNET = { - ...sharedEnv, - APP_NAME: 'Teloscan zkEVM (testnet)', - NETWORK_EVM_NAME: 'telos-zkevm-testnet', // 'telos-zkevm-testnet', telos-evm-testnet -}; - -const MAINNET = { - ...sharedEnv, - APP_NAME: 'Teloscan', - NETWORK_EVM_NAME: 'telos-evm', -}; +const chains = { + testnet: { + ...sharedEnv, + APP_NAME: 'Teloscan (testnet)', + NETWORK_EVM_NAME: 'telos-evm-testnet', + }, + mainnet: { + ...sharedEnv, + APP_NAME: 'Teloscan', + NETWORK_EVM_NAME: 'telos-evm', + }, + zkevm_testnet: { + ...sharedEnv, + APP_NAME: 'Teloscan zkEVM (testnet)', + NETWORK_EVM_NAME: 'telos-zkevm-testnet', + } +} -const env = process.env.NETWORK === 'mainnet' ? MAINNET : TESTNET; +const env = chains[process.env.NETWORK?.toLowerCase()] || chains.testnet; module.exports = env; From bb4af43854b6a42d62aa1885f82b17da6d5ef5d3 Mon Sep 17 00:00:00 2001 From: Jesse Schulman Date: Fri, 20 Dec 2024 21:45:16 -0800 Subject: [PATCH 05/13] Fix linting --- env.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/env.js b/env.js index f6f44346..152e16a0 100644 --- a/env.js +++ b/env.js @@ -25,8 +25,8 @@ const chains = { ...sharedEnv, APP_NAME: 'Teloscan zkEVM (testnet)', NETWORK_EVM_NAME: 'telos-zkevm-testnet', - } -} + }, +}; const env = chains[process.env.NETWORK?.toLowerCase()] || chains.testnet; From 4b51b689469b9376c62919c94abc08d086698ebc Mon Sep 17 00:00:00 2001 From: "J.T. Buice" Date: Sat, 21 Dec 2024 10:02:27 -0600 Subject: [PATCH 06/13] Update index.ts --- src/config/chains/telos-zkevm-testnet/index.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/config/chains/telos-zkevm-testnet/index.ts b/src/config/chains/telos-zkevm-testnet/index.ts index 1e39a14d..dd27ded7 100644 --- a/src/config/chains/telos-zkevm-testnet/index.ts +++ b/src/config/chains/telos-zkevm-testnet/index.ts @@ -57,17 +57,16 @@ const config: NetworkConfig = 'escrowContractAddress': '', 'apiEndpoints': { 'rpc': { - 'protocol': 'http', + 'protocol': 'https', 'host': 'zkrpc.testnet.telos.net', 'port': 8124, - 'path': '/evm', }, - 'api': 'http://localhost:8800/v1', - 'hyperion': 'http://34.57.215.93:8124/', + 'api': 'https://zktest.teloscan.io/v1', + 'hyperion': 'https://mainnet.telos.net/', 'explorer': 'https://teloscan.io', 'ecosystem': 'https://www.telos.net/ecosystem', 'bridge': 'https://bridge.telos.net/bridge', - 'indexer': 'http://localhost:8800/', + 'indexer': 'https://zktest.teloscan.io/', 'contractsBucket': 'https://verified-evm-contracts.s3.amazonaws.com', 'monitor': 'https://api.monitor-test.telos.net', }, From fc7fa925c2aec4bb4e979f26459cc48c309be115 Mon Sep 17 00:00:00 2001 From: "J.T. Buice" Date: Sat, 21 Dec 2024 10:04:35 -0600 Subject: [PATCH 07/13] Update index.ts --- src/config/chains/telos-zkevm-testnet/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config/chains/telos-zkevm-testnet/index.ts b/src/config/chains/telos-zkevm-testnet/index.ts index dd27ded7..d3d22c45 100644 --- a/src/config/chains/telos-zkevm-testnet/index.ts +++ b/src/config/chains/telos-zkevm-testnet/index.ts @@ -60,6 +60,7 @@ const config: NetworkConfig = 'protocol': 'https', 'host': 'zkrpc.testnet.telos.net', 'port': 8124, + 'path': '', }, 'api': 'https://zktest.teloscan.io/v1', 'hyperion': 'https://mainnet.telos.net/', From 3a5e57a8782fbed658f1b4259152fce230dff5c6 Mon Sep 17 00:00:00 2001 From: Jesse Schulman Date: Sat, 21 Dec 2024 11:48:50 -0800 Subject: [PATCH 08/13] Move methods to ContractManager to fix addresses showing up --- src/lib/contract/ContractManager.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/contract/ContractManager.js b/src/lib/contract/ContractManager.js index 41faf011..4550bd2b 100644 --- a/src/lib/contract/ContractManager.js +++ b/src/lib/contract/ContractManager.js @@ -20,14 +20,6 @@ class AddressCacheManager { return useChainStore().currentChain.settings.getNetwork(); } - getTokenListUrl() { - return useChainStore().currentChain.settings.getTokenListUrl(); - } - - getSystemContractsListUrl() { - return useChainStore().currentChain.settings.getSystemContractsListUrl(); - } - loadFromLocalStorage() { const storedContractInfo = localStorage.getItem('contractInfoByNetwork'); if (storedContractInfo) { @@ -96,6 +88,14 @@ export default class ContractManager { return this.contracts[network][address.toLowerCase()] || null; } + getTokenListUrl() { + return useChainStore().currentChain.settings.getTokenListUrl(); + } + + getSystemContractsListUrl() { + return useChainStore().currentChain.settings.getSystemContractsListUrl(); + } + setNetworkContract(address, contract) { const network = useChainStore().currentChain.settings.getNetwork(); if (!this.contracts[network]) { From 3910ec663bfacd27891c9be1fcaa488579e27f4f Mon Sep 17 00:00:00 2001 From: Jesse Schulman Date: Sat, 21 Dec 2024 12:30:27 -0800 Subject: [PATCH 09/13] Fixing zkevm config values --- src/config/chains/telos-zkevm-testnet/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config/chains/telos-zkevm-testnet/index.ts b/src/config/chains/telos-zkevm-testnet/index.ts index d3d22c45..75c3aacd 100644 --- a/src/config/chains/telos-zkevm-testnet/index.ts +++ b/src/config/chains/telos-zkevm-testnet/index.ts @@ -59,15 +59,15 @@ const config: NetworkConfig = 'rpc': { 'protocol': 'https', 'host': 'zkrpc.testnet.telos.net', - 'port': 8124, + 'port': 443, 'path': '', }, - 'api': 'https://zktest.teloscan.io/v1', + 'api': 'https://api.telos.net/v1', 'hyperion': 'https://mainnet.telos.net/', - 'explorer': 'https://teloscan.io', + 'explorer': 'https://zktest.teloscan.io', 'ecosystem': 'https://www.telos.net/ecosystem', 'bridge': 'https://bridge.telos.net/bridge', - 'indexer': 'https://zktest.teloscan.io/', + 'indexer': 'https://api.zktest.teloscan.io/', 'contractsBucket': 'https://verified-evm-contracts.s3.amazonaws.com', 'monitor': 'https://api.monitor-test.telos.net', }, From 98e22b9615acc0bc250d66e006e657ac52c37a3d Mon Sep 17 00:00:00 2001 From: Viterbo Date: Tue, 24 Dec 2024 12:41:03 -0300 Subject: [PATCH 10/13] add title image to the list of theme config values --- public/branding/telos-teloscan-logo--dark.png | Bin 0 -> 5785 bytes .../telos-teloscan-logo-testnet--dark.png | Bin 0 -> 6731 bytes .../branding/telos-teloscan-logo-testnet.png | Bin 0 -> 6854 bytes public/branding/telos-teloscan-logo.png | Bin 0 -> 5897 bytes .../branding/teloszk-teloscan-logo--dark.png | Bin 0 -> 11530 bytes public/branding/teloszk-teloscan-logo.png | Bin 0 -> 10739 bytes src/assets/telos-teloscan-logo.xcf | Bin 0 -> 79207 bytes src/components/header/AppHeaderBottomBar.vue | 24 +++++++++--------- src/config/chains/telos-evm-testnet/index.ts | 2 ++ src/config/chains/telos-evm/index.ts | 2 ++ .../chains/telos-zkevm-testnet/index.ts | 9 ++++--- src/core/types/NetworkConfig.ts | 2 ++ 12 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 public/branding/telos-teloscan-logo--dark.png create mode 100644 public/branding/telos-teloscan-logo-testnet--dark.png create mode 100644 public/branding/telos-teloscan-logo-testnet.png create mode 100644 public/branding/telos-teloscan-logo.png create mode 100644 public/branding/teloszk-teloscan-logo--dark.png create mode 100644 public/branding/teloszk-teloscan-logo.png create mode 100644 src/assets/telos-teloscan-logo.xcf diff --git a/public/branding/telos-teloscan-logo--dark.png b/public/branding/telos-teloscan-logo--dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff0e87c5a833d6f6a35abff58550a82e841cedc GIT binary patch literal 5785 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 literal 0 HcmV?d00001 diff --git a/public/branding/telos-teloscan-logo-testnet.png b/public/branding/telos-teloscan-logo-testnet.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b3c41e1c2a46c7099708a4a43a9fbe20d7478b GIT binary patch literal 6854 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 AO#lD@ literal 0 HcmV?d00001 diff --git a/public/branding/telos-teloscan-logo.png b/public/branding/telos-teloscan-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4436ba70e9c58ada233e476ee3308ba64e01477b GIT binary patch literal 5897 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 z

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

Pfy?7ID>HqqZU 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 n#+;z0|Jfk-|ASX@?T;aL{(2=A24DW`{X& literal 0 HcmV?d00001 diff --git a/src/assets/telos-teloscan-logo.xcf b/src/assets/telos-teloscan-logo.xcf new file mode 100644 index 0000000000000000000000000000000000000000..9d9c6e4525c0942258f1f0660406b99d8773e126 GIT binary patch literal 79207 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 literal 0 HcmV?d00001 diff --git a/src/components/header/AppHeaderBottomBar.vue b/src/components/header/AppHeaderBottomBar.vue index 0829f977..eceb79fc 100644 --- a/src/components/header/AppHeaderBottomBar.vue +++ b/src/components/header/AppHeaderBottomBar.vue @@ -1,5 +1,5 @@ +