Skip to content
This repository was archived by the owner on Jan 9, 2026. It is now read-only.

Commit 0bff7e6

Browse files
authored
Merge pull request #3 from kadena-io/feat/kadena-implementation
Feat/kadena implementation
2 parents 65b52ff + d14d231 commit 0bff7e6

File tree

262 files changed

+50053
-368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

262 files changed

+50053
-368
lines changed

.env

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
CHAIN_ID=1790
2+
CHAINWEB_CHAIN_ID=20
3+
SUBNETWORK=Chain${CHAIN_ID}
4+
NEXT_PUBLIC_NETWORK_ID=${CHAIN_ID}
5+
NEXT_PUBLIC_NETWORK_NAME="Chainweb EVM"
6+
BLOCKSCOUT_DB_NAME=blockscout_${CHAIN_ID}
7+
STATS_DB_NAME=stats_${CHAIN_ID}
8+
EXPLORER_MAIN_URL=chain-${CHAINWEB_CHAIN_ID}.evm.kadena.internal
9+
CHAIN_PUBLIC_URL=chain-${CHAINWEB_CHAIN_ID}.evm.kadena.internal
10+
BLOCKSCOUT_BACKEND_URL=http://chain-${CHAINWEB_CHAIN_ID}.evm.kadena.internal
11+
PROXY_UI_PORT=8008
12+
PROXY_STATS_PORT=8080
13+
PROXY_VISUALIZER_PORT=8081
14+
NEXT_PUBLIC_APP_PORT=${PROXY_UI_PORT}
15+
NEXT_PUBLIC_API_PORT=8000
16+
NEXT_PUBLIC_STATS_API_HOST=${BLOCKSCOUT_BACKEND_URL}:${PROXY_STATS_PORT}
17+
NEXT_PUBLIC_VISUALIZE_API_HOST=http://${EXPLORER_MAIN_URL}:${PROXY_VISUALIZER_PORT}
18+
NEXT_PUBLIC_API_HOST=${CHAIN_PUBLIC_URL}
19+
NEXT_PUBLIC_APP_HOST=chain-${CHAINWEB_CHAIN_ID}.evm.kadena.internal
20+
BLOCKSCOUT_DB_URL=postgresql://blockscout:ceWb1MeLBEeOIfk65gU8EjF8@db:5432/${BLOCKSCOUT_DB_NAME}
21+
JSONRPC_HTTP=http://chain-${CHAINWEB_CHAIN_ID}.evm.kadena.internal:1848/chainweb/0.0/evm-development/${CHAINWEB_CHAIN_ID}/evm/rpc/
22+
JSONRPC_WS_URL=ws://chain-${CHAINWEB_CHAIN_ID}.evm.kadena.internal:1848/chainweb/0.0/evm-development/${CHAINWEB_CHAIN_ID}/evm/rpc/
23+
ETHEREUM_JSONRPC_HTTP_URL=${JSONRPC_HTTP}
24+
ETHEREUM_JSONRPC_WS_URL=${JSONRPC_WS_URL}
25+
ETHEREUM_JSONRPC_TRACE_URL=${JSONRPC_HTTP}
26+
USER_OPS_INDEXER__INDEXER__RPC_URL=${JSONRPC_WS_URL}
27+
NEXT_PUBLIC_API_PROTOCOL=http
28+
NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL=ws
29+
NEXT_PUBLIC_NETWORK_SHORT_NAME=KdaEvmDevnet
30+
NEXT_PUBLIC_NETWORK_CURRENCY_NAME=Kadena
31+
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL=KDA
32+
NEXT_PUBLIC_NETWORK_CURRENCY_WEI_NAME=stu
33+
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS=18
34+
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE=mining
35+
NEXT_PUBLIC_IS_TESTNET=true
36+
NEXT_PUBLIC_API_BASE_PATH=/
37+
NEXT_PUBLIC_APP_PROTOCOL=http
38+
NEXT_PUBLIC_HOMEPAGE_CHARTS=["daily_txs"]
39+
# NEXT_PUBLIC_HOMEPAGE_STATS=["total_blocks","average_block_time","total_txs","wallet_addresses","gas_tracker","btc_locked"]
40+
NEXT_PUBLIC_API_SPEC_URL=https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml
41+
NEXT_PUBLIC_AD_BANNER_PROVIDER=none
42+
NEXT_PUBLIC_PROMOTE_BLOCKSCOUT_IN_TITLE=false
43+
NEXT_PUBLIC_AD_TEXT_PROVIDER=none
44+
NEXT_PUBLIC_NETWORK_LOGO=https://www.kadena.io/_next/static/media/logo_sm.76a6235e.svg
45+
NEXT_PUBLIC_NETWORK_ICON=https://www.kadena.io/_next/static/media/logo_sm.76a6235e.svg
46+
NEXT_PUBLIC_APP_NAME=Chainweb EVM Explorer
47+
NEXT_PUBLIC_APP_SHORT_NAME=EVM Explorer
48+
NEXT_PUBLIC_APP_VERSION=0.1.0
49+
50+
NEXT_PUBLIC_FEATURED_BASE_NETWORK=mainnet
51+
# [{"title":"Mainnet","id":"mainnet","url":"http://chain-%s.evm.kadena.internal:8000/","isActive":true,"icon":"https://www.kadena.io/favicon.ico"},{"title":"Devnet","id":"devnet","url":"http://chain-%s.evm.kadena.internal:8000/","isActive":true,"icon":"https://www.kadena.io/favicon.ico"},{"title":"Testnet","id":"testnet","url":"http://chain-%s.evm.kadena.internal:8000/","isActive":false,"icon":"https://www.kadena.io/favicon.ico"}]
52+
NEXT_PUBLIC_FEATURED_NETWORKS=/assets/configs/networks.json
53+
# [{"title":"Chain 20","url":"http://chain-20.evm.kadena.internal:8000/","group":"mainnet","icon":"https://www.kadena.io/favicon.ico"},{"title":"Chain 21","url":"http://chain-21.evm-devnet.kadena.internal:8000/","group":"devnet","icon":"https://www.kadena.io/favicon.ico"},{"title":"Chain 22","url":"http://chain-22.evm-mainnet.kadena.internal:8000/","group":"mainnet","icon":"https://www.kadena.io/favicon.ico"},{"title":"Chain 23","url":"http://chain-23.evm.kadena.internal:8000/","group":"mainnet","icon":"https://www.kadena.io/favicon.ico"},{"title":"Chain 24","url":"http://chain-24.evm-testnet.kadena.internal:8000/","group":"testnet","icon":"https://www.kadena.io/favicon.ico"}]
54+
NEXT_PUBLIC_FEATURED_CHAINS=/assets/configs/chains.json
55+
56+
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID=123456
57+
NEXT_PUBLIC_NETWORK_RPC_URL=https://evm-testnet.chainweb.com/chainweb/0.0/evm-testnet/${CHAINWEB_CHAIN_ID}/evm/rpc/

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,7 @@ yarn-error.log*
6161

6262
# build outputs
6363
/tools/preset-sync/index.js
64-
/toolkit/package/dist
64+
/toolkit/package/dist
65+
66+
toolkit/theme/example
67+
designid.config.js

configs/app/app.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ const isPw = getEnvValue('NEXT_PUBLIC_APP_INSTANCE') === 'pw';
1414
const spriteHash = getEnvValue('NEXT_PUBLIC_ICON_SPRITE_HASH');
1515

1616
const app = Object.freeze({
17+
name: getEnvValue('NEXT_PUBLIC_APP_NAME') || 'Chainweb EVM Explorer',
18+
shortName: getEnvValue('NEXT_PUBLIC_APP_SHORT_NAME') || 'EVM Explorer',
19+
version: getEnvValue('NEXT_PUBLIC_APP_VERSION') || '0.0.1',
1720
isDev,
1821
isPw,
1922
protocol: appSchema,

configs/app/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import app from './app';
33
import chain from './chain';
44
import * as features from './features';
55
import meta from './meta';
6+
import network from './network';
67
import services from './services';
78
import UI from './ui';
89

910
const config = Object.freeze({
1011
app,
12+
network,
1113
chain,
1214
apis,
1315
UI,

configs/app/network.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { getEnvValue } from './utils';
2+
3+
const name = getEnvValue('NEXT_PUBLIC_KADENA_NETWORK_NAME') ?? 'devnet';
4+
5+
const network = Object.freeze({
6+
name,
7+
});
8+
9+
export default network;

configs/app/ui.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,10 @@ const UI = Object.freeze({
6565
hiddenLinks,
6666
highlightedRoutes,
6767
otherLinks: parseEnvJson<Array<NavItemExternal>>(getEnvValue('NEXT_PUBLIC_OTHER_LINKS')) || [],
68-
featuredNetworks: getExternalAssetFilePath('NEXT_PUBLIC_FEATURED_NETWORKS'),
68+
baseNetwork: getEnvValue('NEXT_PUBLIC_FEATURED_BASE_NETWORK') || 'mainnet',
69+
baseChain: getEnvValue('CHAINWEB_CHAIN_ID') || 20,
70+
featuredNetworks: getExternalAssetFilePath('NEXT_PUBLIC_FEATURED_NETWORKS') ?? '/assets/configs/networks.json',
71+
featuredChains: getExternalAssetFilePath('NEXT_PUBLIC_FEATURED_CHAINS') ?? '/assets/configs/chains.json',
6972
layout: (getEnvValue('NEXT_PUBLIC_NAVIGATION_LAYOUT') || 'vertical') as NavigationLayout,
7073
},
7174
footer: {

deploy/scripts/download_assets.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ ASSETS_ENVS=(
2020
"NEXT_PUBLIC_MARKETPLACE_BANNER_CONTENT_URL"
2121
"NEXT_PUBLIC_MARKETPLACE_GRAPH_LINKS_URL"
2222
"NEXT_PUBLIC_FEATURED_NETWORKS"
23+
"NEXT_PUBLIC_FEATURED_CHAINS"
2324
"NEXT_PUBLIC_FOOTER_LINKS"
2425
"NEXT_PUBLIC_NETWORK_LOGO"
2526
"NEXT_PUBLIC_NETWORK_LOGO_DARK"

deploy/tools/envs-validator/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ async function validateEnvs(appEnvs: Record<string, string>) {
3737
// replace ENVs with external JSON files content
3838
const envsWithJsonConfig = [
3939
'NEXT_PUBLIC_FEATURED_NETWORKS',
40+
'NEXT_PUBLIC_FEATURED_CHAINS',
4041
'NEXT_PUBLIC_MARKETPLACE_CONFIG_URL',
4142
'NEXT_PUBLIC_MARKETPLACE_CATEGORIES_URL',
4243
'NEXT_PUBLIC_MARKETPLACE_SECURITY_REPORTS_URL',

deploy/tools/envs-validator/schema.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { SUPPORTED_WALLETS } from '../../../types/client/wallets';
3232
import type { CustomLink, CustomLinksGroup } from '../../../types/footerLinks';
3333
import { CHAIN_INDICATOR_IDS, HOME_STATS_WIDGET_IDS } from '../../../types/homepage';
3434
import type { ChainIndicatorId, HeroBannerButtonState, HeroBannerConfig, HomeStatsWidgetId } from '../../../types/homepage';
35-
import { type NetworkVerificationTypeEnvs, type NetworkExplorer, type FeaturedNetwork, NETWORK_GROUPS } from '../../../types/networks';
35+
import { type NetworkVerificationTypeEnvs, type NetworkExplorer, type FeaturedNetwork, NETWORK_GROUPS, FeaturedChain } from '../../../types/networks';
3636
import { COLOR_THEME_IDS } from '../../../types/settings';
3737
import type { FontFamily } from '../../../types/ui';
3838
import type { AddressFormat, AddressViewId } from '../../../types/views/address';
@@ -552,6 +552,17 @@ const featuredNetworkSchema: yup.ObjectSchema<FeaturedNetwork> = yup
552552
invertIconInDarkMode: yup.boolean(),
553553
});
554554

555+
const featuredChainsSchema: yup.ObjectSchema<FeaturedChain> = yup
556+
.object()
557+
.shape({
558+
title: yup.string().required(),
559+
url: yup.string().test(urlTest).required(),
560+
group: yup.string().oneOf(NETWORK_GROUPS).required(),
561+
icon: yup.string().test(urlTest),
562+
isActive: yup.boolean(),
563+
invertIconInDarkMode: yup.boolean(),
564+
});
565+
555566
const navItemExternalSchema: yup.ObjectSchema<NavItemExternal> = yup
556567
.object({
557568
text: yup.string().required(),
@@ -815,6 +826,10 @@ const schema = yup
815826
.array()
816827
.json()
817828
.of(featuredNetworkSchema),
829+
NEXT_PUBLIC_FEATURED_CHAINS: yup
830+
.array()
831+
.json()
832+
.of(featuredChainsSchema),
818833
NEXT_PUBLIC_OTHER_LINKS: yup
819834
.array()
820835
.transform(replaceQuotes)

designid.config.ts

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import type { TConfigFile } from '@designid/tokens';
2+
3+
const $fonts = [ 100, 400, 600, 800, 900 ].reduce((acc, weight) => ([
4+
...(acc ?? []),
5+
{
6+
family: '"Inter", sans-serif',
7+
style: 'Normal',
8+
faceStyle: 'normal',
9+
weight,
10+
linkHref: `https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,${ weight }&display=swap`,
11+
format: 'woff2',
12+
},
13+
{
14+
family: '"Inter", sans-serif',
15+
style: 'Italic',
16+
faceStyle: 'italic',
17+
weight,
18+
linkHref: `https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@1,14..32,${ weight }&display=swap`,
19+
format: 'woff2',
20+
},
21+
{
22+
family: '"Kode Mono", monospace',
23+
style: 'Normal',
24+
faceStyle: 'normal',
25+
weight,
26+
linkHref: `https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,${ weight }&family=Kode+Mono:wght@400..700&display=swap`,
27+
format: 'woff2',
28+
},
29+
]), [] as TConfigFile['$fonts']);
30+
31+
const config: TConfigFile = {
32+
$name: 'Kadena Design System Tokens',
33+
$version: '0.0.1',
34+
$paths: {
35+
baseDir: './toolkit/theme/design-system',
36+
distDir: './dist',
37+
buildDir: './build',
38+
tokensDir: './tokens',
39+
assets: {
40+
icons: {
41+
sourceDir: '../../../icons',
42+
},
43+
fonts: {
44+
sourceDir: './assets/fonts',
45+
},
46+
},
47+
},
48+
$modes: {
49+
50+
'default': 'light',
51+
dark: 'dark',
52+
},
53+
$fonts,
54+
$metaData: {
55+
tokenNamespace: 'kda',
56+
colorspace: 'hex',
57+
fontNamespace: 'font',
58+
tokens: {
59+
css: {
60+
mediaQuery: {
61+
match: '.',
62+
separateThemeFiles: false,
63+
},
64+
hooks: {
65+
shortenName: {
66+
enabled: true,
67+
prefix: [
68+
{
69+
find: 'kda-foundation-',
70+
replace: 'kda-',
71+
},
72+
],
73+
suffix: [
74+
{
75+
find: '-default',
76+
replace: '',
77+
},
78+
],
79+
},
80+
},
81+
},
82+
},
83+
},
84+
};
85+
86+
export default config;

0 commit comments

Comments
 (0)