From c3e415eb69cdb5c53e2b57736c7f30a70aa64736 Mon Sep 17 00:00:00 2001 From: "ammar.abdullah" Date: Sun, 19 Jul 2026 22:05:03 +0800 Subject: [PATCH] feat(chains): add Zetrix L2 Testnet (938748) to supported chains Adds Zetrix L2 Testnet (EVM, chainId 938748, native ZETRIX2, 18 decimals) so TrustVC-based verifiers can validate transferable records / eBL issued on the chain out of the box. - CHAIN_ID.zetrixL2Testnet = '938748' + SUPPORTED_CHAINS entry - networkName 'zetrixL2Testnet' + networkCurrency 'ZETRIX2' - placeholder chain icon (to be replaced with the official Zetrix asset) - test coverage for the new entry RPC https://z2-test-node.zetrix.com, explorer https://z2-test-explorer.zetrix.com (EIP-3091). --- src/utils/network/index.ts | 3 ++- src/utils/static/icons.ts | 4 +++ src/utils/supportedChains/index.ts | 25 ++++++++++++++++++- .../supportedChains/supportedChains.test.ts | 12 +++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/utils/network/index.ts b/src/utils/network/index.ts index 21b332d..8f2dc66 100644 --- a/src/utils/network/index.ts +++ b/src/utils/network/index.ts @@ -11,10 +11,11 @@ export const networks = [ 'stability', 'astron', 'astrontestnet', + 'zetrixL2Testnet', ] as const; export type networkName = (typeof networks)[number]; export type networkType = 'production' | 'test' | 'development'; -export type networkCurrency = 'ETH' | 'MATIC' | 'POL' | 'XDC' | 'FREE' | 'ASTRON'; +export type networkCurrency = 'ETH' | 'MATIC' | 'POL' | 'XDC' | 'FREE' | 'ASTRON' | 'ZETRIX2'; diff --git a/src/utils/static/icons.ts b/src/utils/static/icons.ts index 671b3cd..b7b2a48 100644 --- a/src/utils/static/icons.ts +++ b/src/utils/static/icons.ts @@ -12,3 +12,7 @@ export const iconStability = export const iconAstron = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABLCAYAAACGGCK3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAJVWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgNzkuYTg3MzFiOSwgMjAyMS8wOS8wOS0wMDozNzozOCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjQtMTEtMDFUMTU6NTk6NDQrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMTEtMDFUMTY6MDA6NDYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI0LTExLTAxVDE2OjAwOjQ2KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo4MzdjMDRmNi1hYmVlLWNjNGQtYTVjMy0wYWIyNzAyNWY5OGEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1ODA4ZmFmMi1iMjEwLTQ4NDYtYTAxZC04MWM0ZTUyYWM4ZDgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplMWFjZDRjMy1iODBmLWIyNGQtODRkZi05ZjFmOGU4ZWVjYzQiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmUxYWNkNGMzLWI4MGYtYjI0ZC04NGRmLTlmMWY4ZThlZWNjNCIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0wMVQxNTo1OTo0NCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyM2NhNjU0Zi02N2YyLTc1NDUtOTUxMC1lYWQ0NGIyNTAwMzciIHN0RXZ0OndoZW49IjIwMjQtMTEtMDFUMTY6MDA6MTQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MGZlNDllMGItMWM5NS1jNTRkLTkxMzMtNmQ1ZjEyMjY2YTgxIiBzdEV2dDp3aGVuPSIyMDI0LTExLTAxVDE2OjAwOjQ2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjMuMCAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9wbmciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgzN2MwNGY2LWFiZWUtY2M0ZC1hNWMzLTBhYjI3MDI1Zjk4YSIgc3RFdnQ6d2hlbj0iMjAyNC0xMS0wMVQxNjowMDo0NiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIzLjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowZmU0OWUwYi0xYzk1LWM1NGQtOTEzMy02ZDVmMTIyNjZhODEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6ZTFhY2Q0YzMtYjgwZi1iMjRkLTg0ZGYtOWYxZjhlOGVlY2M0IiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZTFhY2Q0YzMtYjgwZi1iMjRkLTg0ZGYtOWYxZjhlOGVlY2M0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+nXIWZAAACMRJREFUeJztmn90j9cdx19fEroojfwQEj9adNaSlT7EapTWOBqipYrVTupouq4c2p7ObNPnYI+y1El/MHJsmVZsDjaNH21nhklWauZZKTOGNUIiCUFbbWl+fPfHvdf3+T75Joxt7pn7Ouc597m/73Pf937u536TQDAYxKAPTW70AAzhGEE0wwiiGUYQzTCCaIYRRDOMIJphBNEMI4hmGEE0wwiiGUYQzTCCaIYRRDOMIJphBNEMI4hmGEE0wwiiGUYQzTCCaIYRRDOMIJphBNEMI4hmGEF0IxgMhj1+yqemBW7AsG4a/PPf6A45NanXaKCq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'; + +// Placeholder mark — replace with the official Zetrix brand asset before/at merge. +export const iconZetrix = + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHJ4PSI2IiBmaWxsPSIjMEUyQTQ3Ii8+PHBhdGggZD0iTTggOGgxNnYzLjJMMTMuNiAyMUgyNHYzSDh2LTMuMkwxOC40IDExSDh6IiBmaWxsPSIjMzFDOEMwIi8+PC9zdmc+'; diff --git a/src/utils/supportedChains/index.ts b/src/utils/supportedChains/index.ts index e0e9fca..2ca9497 100644 --- a/src/utils/supportedChains/index.ts +++ b/src/utils/supportedChains/index.ts @@ -1,6 +1,13 @@ import 'dotenv/config'; import { gasStation, GasStationFeeData } from '../gasStation'; -import { iconAstron, iconEthereum, iconPolygon, iconStability, iconXDC } from '../static/icons'; +import { + iconAstron, + iconEthereum, + iconPolygon, + iconStability, + iconXDC, + iconZetrix, +} from '../static/icons'; import { networkCurrency, networkName, networkType } from './../network'; export enum CHAIN_ID { @@ -17,6 +24,7 @@ export enum CHAIN_ID { stability = '101010', astron = '1338', astrontestnet = '21002', + zetrixL2Testnet = '938748', } export type chainInfo = { @@ -202,4 +210,19 @@ export const SUPPORTED_CHAINS: supportedChains = { decimals: 18, }, }, + [CHAIN_ID.zetrixL2Testnet]: { + id: CHAIN_ID.zetrixL2Testnet, + label: 'Zetrix L2 Testnet', + name: 'zetrixL2Testnet', + type: 'test', + currency: 'ZETRIX2', + iconImage: iconZetrix, + explorerUrl: 'https://z2-test-explorer.zetrix.com', + rpcUrl: `https://z2-test-node.zetrix.com`, + nativeCurrency: { + name: 'ZETRIX2', + symbol: 'ZETRIX2', + decimals: 18, + }, + }, }; diff --git a/src/utils/supportedChains/supportedChains.test.ts b/src/utils/supportedChains/supportedChains.test.ts index bc0b2ec..6fbb934 100644 --- a/src/utils/supportedChains/supportedChains.test.ts +++ b/src/utils/supportedChains/supportedChains.test.ts @@ -128,4 +128,16 @@ describe('supportedChains', () => { expect(currency).toBe('ASTRON'); expect(explorerUrl).toBe('https://dev-astronscanl2.bitfactory.cn/'); }); + it('should zetrixL2Testnet chain info correctly', () => { + const { id, name, type, currency, explorerUrl, rpcUrl } = + SUPPORTED_CHAINS[CHAIN_ID.zetrixL2Testnet]; + + expect(id).toBe(CHAIN_ID.zetrixL2Testnet); + expect(id).toBe('938748'); + expect(name).toBe('zetrixL2Testnet'); + expect(type).toBe('test'); + expect(currency).toBe('ZETRIX2'); + expect(explorerUrl).toBe('https://z2-test-explorer.zetrix.com'); + expect(rpcUrl).toBe('https://z2-test-node.zetrix.com'); + }); });